如何让RestSharp使用BSON



我正在使用RestSharp,并使用Json.NET进行序列化(请参阅此处)。

Json.NET支持BSON,而且由于我的一些请求有巨大的二进制数据块,我认为这将大大加快我的应用程序。然而,据我所知,RestSharp似乎对BSON没有任何内置支持。

Json.NET的使用是作为RestSharp的自定义序列化程序实现的,因此乍一看,可以将该自定义序列化程序修改为使用BSON。但是,RestSharp.Serializers.ISerializer接口的Serialize方法返回一个string-(我认为)不适合BSON。因此,我认为需要对RestSharp进行一些更重大的更改才能实现这一更改。

有人想办法做到这一点吗?


更新:我查看了RestSharp的源代码,发现接收我的对象并将其序列化到请求体中的RestRequest.AddBody方法最终调用Request.AddParameter(带有序列化的对象数据和参数类型RequestBody)。

我想我可以将我的对象序列化到BSON,然后直接调用Request.AddParameter——事实上我可以。然而,当RestSharp随后执行RestRequest时,它无法将二进制内容放入请求中,因为存在关于请求内容是UTF-8编码的其他嵌入假设。

因此,看起来这个黑客攻击是行不通的——需要对RestSharp本身进行一些更改,而我不是这份工作的合适人选。。。


更新2:我决定尝试使用调试器来计算我需要更改多少RestSharp才能克服正文编码问题,所以我换掉了我的NuGet版本的RestSharp,并将RestSharp项目包含在我的解决方案中。和它有效

事实证明,在过去的几个月里,RestSharp有一个变化,但NuGet版本中还没有。

因此,现在可以使用AddParameter并传入一个已经BSON编码的对象,RestSharp将毫无怨言地将其发送到服务器。

根据我问题中的更新,事实证明,如果你有最新的RestSharp源,那么不是这个:

        request.AddBody(myObject);

你可以这样做,只要你有一个有效载荷将受益于使用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的情况下,它实际上被用作内容类型。(余)。

请注意,这依赖于ewanmellor/ayoung于2013年4月11日对RestSharp所做的更改,并且在NuGet(104.1)的当前版本中,此更改是而不是。因此,只有在您的项目中包含当前RestSharp源代码时,此更改才会起作用。

Gary对自己问题的回答对于序列化restful调用非常有用。我想回答如何使用JSON.NET反序列化restful调用。我使用的是用于Silverlight的RestSharp 104.4版本。我的服务器正在使用Web API 2.1,BSON支持已打开。

要接受BSON响应,请像一样为RestSharp创建一个BSON反序列化程序

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());

相关内容

  • 没有找到相关文章

最新更新