序列化和反序列化HttpRequestMessage对象

Odd*_*eif 7 .net c# serialization json.net

任何人都有序列化HttpRequestMessage对象的经验?尝试使用Json.net,它可以部分运行.也就是说,JsonConvert.DeserializeObject由于结构问题而失败StringContent:"无法找到用于类型System.Net.Http.StringContent的构造函数".

这里的用例很简单,我想保存Web请求并在以后发出,如果出现临时网络问题或服务不可用等.

失败的示例代码:

var request = new HttpRequestMessage(HttpMethod.POST, "http://www.something.com");
request.Headers.Date = DateTimeOffset.UtcNow;
request.Headers.AcceptLanguage.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("en-US"));
request.Content = new StringContent("Hello World!");
request.Content.Headers.Add("x-some", "thing");                       

var result = JsonConvert.SerializeObject(request, new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.Objects,
    TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full
});

var deserializeRequest = JsonConvert.DeserializeObject<HttpRequestMessage>(result, new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.Objects
}); 
Run Code Online (Sandbox Code Playgroud)

Odd*_*eif 3

可以使用以下示例代码序列化/反序列化 HttpRequest 的相关部分。

var request = new HttpRequestMessage(HttpMethod.Post, "http://www.something.com");
request.Content = new StringContent("Hello World!");

var serializedRequestByteArray = new HttpMessageContent(request).ReadAsByteArrayAsync().Result;

var tmpRequest = new HttpRequestMessage();
tmpRequest.Content = new ByteArrayContent(serializedRequestByteArray);
tmpRequest.Content.Headers.Add("Content-Type", "application/http;msgtype=request");

var deserializedRequest = tmpRequest.Content.ReadAsHttpRequestMessageAsync().Result;  
Run Code Online (Sandbox Code Playgroud)

  • 关于此解决方案需要注意的一件重要事情是,它将丢失 HTTP 方案和凭据(如果有)。所以 HTTPS 在反序列化后将变成 HTTP,无需任何凭据...... (2认同)