我正在使用RestSharp,并使用Json.NET进行序列化(请参阅here)。
Json.NET支持BSON,由于我的一些请求有大量的二进制数据块,我认为这会大大加快我的应用程序。但是,据我所知,RestSharp似乎没有任何内置的BSON支持。
Json.NET的使用是作为RestSharp的自定义序列化程序实现的,因此乍一看似乎可以修改该自定义序列化程序以使用BSON。但是,Serialize
接口的RestSharp.Serializers.ISerializer
方法返回string
- 这是(我假设)不适合BSON。因此,我假设RestSharp需要进行一些更重要的更改才能实现此更改。
有没有人想办法做到这一点?
更新:我查看了RestSharp源代码,发现采用我的对象并将其序列化到请求体中的RestRequest.AddBody
方法最终调用Request.AddParameter
(带有序列化对象数据和参数)输入RequestBody
)。
我想我可以将我的对象序列化为BSON,然后直接调用Request.AddParameter
- 事实上我可以。但是,当RestSharp然后执行RestRequest
时,它无法将二进制内容放入请求中,因为有关于请求内容的其他嵌入式假设是UTF-8编码的。
因此看起来这个hack不起作用 - 需要对RestSharp本身进行一些更改,而且我不是那个工作的人......
更新2:我决定使用调试器来计算我需要更改多少RestSharp来克服身体编码问题,所以我换掉了我的NuGet版本的RestSharp并包含了RestSharp在我的解决方案项目。并且...... 工作。
事实证明,在过去的几个月里,RestSharp已经发生了变化,但尚未进入NuGet版本。
因此,您现在可以使用AddParameter
并传入已经BSON编码的对象,而RestSharp会将其发送到服务器而不会抱怨。
答案 0 :(得分:6)
根据我的问题中的更新,事实证明如果你有最新的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
的情况下,它实际上用作内容类型。 (育)。
请注意,这取决于2013年4月11日由ewanmellor / ayoung对RestSharp进行的change,并且此更改在NuGet(104.1)的当前版本中不。因此,只有在项目中包含当前的RestSharp源时,这才有效。
答案 1 :(得分:3)
Gary对自己的问题的回答对于序列化restful调用非常有用。我想回答如何使用JSON.NET反序列化restful调用。我使用RestSharp版本104.4 for Silverlight。我的服务器正在使用Web API 2.1 with BSON support turned on。
要接受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());