如何让RestSharp使用BSON?

7
我正在使用RestSharp,使用Json.NET进行序列化(请参见这里)。
Json.NET支持BSON,由于我的一些请求具有大块的二进制数据,因此我认为这将极大地加快我的应用程序速度。但是,据我所知,RestSharp似乎没有内置支持BSON。
Json.NET的使用是作为RestSharp的自定义序列化器实现的,因此乍一看,似乎可以修改该自定义序列化器以使用BSON。但是,RestSharp.Serializers.ISerializer接口的Serialize方法返回一个字符串-我认为这不适合BSON。因此,我认为需要对RestSharp进行更重大的更改才能实现此更改。
有人找到了实现这一点的方法吗?
更新:我查看了RestSharp源代码,并发现RestRequest.AddBody方法将我的对象序列化到请求体中,最终调用了Request.AddParameter(使用序列化的对象数据和参数类型RequestBody)。我想,我可以将对象序列化为BSON,然后直接调用Request.AddParameter,事实上我确实可以。但是,当RestSharp执行RestRequest时,它无法将二进制内容放入请求中,因为有其他嵌入式假设,即请求内容被UTF-8编码。因此,这个hack似乎行不通 - 需要对RestSharp本身进行一些更改,而我不是做这份工作的人...
更新2:我决定使用调试器来找出需要更改的RestSharp部分以克服body-encoding问题,因此我替换了NuGet版本的RestSharp并将RestSharp项目包含在我的解决方案中。然后...它起作用了
原来,在过去几个月中,RestSharp发生了变化,但NuGet版本尚未更新。
所以,现在您可以使用AddParameter并传入已经编码为BSON的对象,RestSharp会将其发送到服务器而不会抱怨。
2个回答

6
根据我问题中的更新,如果您拥有最新的RestSharp源代码,则不需要写下面这段代码:
        request.AddBody(myObject);

如果您的有效负载使用BSON会更好,那么每当您有一个需要使用BSON的有效负载时,可以使用此方法代替:

        using (var memoryStream = new System.IO.MemoryStream())
        {
            using (var bsonWriter = new Newtonsoft.Json.Bson.BsonWriter(memoryStream))
            {
                var serializer = new Newtonsoft.Json.JsonSerializer();

                serializer.Serialize(bsonWriter, myObject);

                var bytes = memoryStream.ToArray();

                request.AddParameter("application/bson", bytes, RestSharp.ParameterType.RequestBody);
            }
        }

请注意,AddParameter的第一个参数应该是参数名称,但在ParameterType.RequestBody的情况下,它实际上用作内容类型。(呃)。请注意,这依赖于RestSharp在2013年4月11日ewanmellor/ayoung所做的更改,而此更改包含在NuGet的当前版本(104.1)中。因此,只有在项目中包含当前的RestSharp源代码时,才能使用此功能。

3
Gary对自己的问题的回答非常有用,可以用于序列化restful调用。我想回答如何使用JSON.NET反序列化restful调用。我正在使用Silverlight的RestSharp版本104.4。我的服务器正在使用Web API 2.1,并开启了BSON支持 要接受BSON响应,请像这样为RestSharp创建一个BSON Deserializer。
public class BsonDeserializer : IDeserializer
{
    public string RootElement { get; set; }
    public string Namespace { get; set; }
    public string DateFormat { get; set; }

    public T Deserialize<T>(IRestResponse response)
    {
        using (var memoryStream = new MemoryStream(response.RawBytes))
        {
            using (var bsonReader = new BsonReader(memoryStream))
            {
                var serializer = new JsonSerializer();
                return serializer.Deserialize<T>(bsonReader);
            }
        }
    }
}

然后,确保您的请求接受 "application/bson" 格式

var request = new RestRequest(apiUrl, verb);
request.AddHeader("Accept", "application/bson");

并为该媒体类型添加处理程序

var client = new RestClient(url);
client.AddHandler("application/bson", new BsonDeserializer());

这个答案对我帮助很大,如果有人在添加处理程序时遇到“序列包含多个元素”的异常,我通过在 RestClient 实例中添加处理程序之前添加默认标头来解决了这个问题。 - yvesmancera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接