When I deserialise-serialise-deserialise and compare request and request2 in code below, UserAgent header has the correct .ToString() value but count is 0. So my unit test was failing:
var stream = new FileStream("Request.bin", FileMode.Open);
var serializer = new MessageContentHttpMessageSerializer();
var request = serializer.DeserializeToRequest(stream);
var memoryStream = new MemoryStream();
serializer.Serialize(request, memoryStream);
memoryStream.Position = 0;
var request2 = serializer.DeserializeToRequest(memoryStream);
Comments: This problem seems to not exist in current source and only in RTM. The code for HttpMessageContent has changed to allow dealing with UserAgent differently. _______________________________________________________________________________________________________ This is MessageContentHttpMessageSerializer: using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; using System.Text; namespace WebApiContrib.Serialization { public class MessageContentHttpMessageSerializer { private bool _bufferContent; public MessageContentHttpMessageSerializer() : this(false) { } public MessageContentHttpMessageSerializer(bool bufferContent) { _bufferContent = bufferContent; } public void Serialize(HttpResponseMessage response, Stream stream) { byte[] assuranceBuffer = null; if (_bufferContent && response.Content != null) assuranceBuffer = response.Content.ReadAsByteArrayAsync().Result; // make sure it is buffered var httpMessageContent = new HttpMessageContent(response); var buffer = httpMessageContent.ReadAsByteArrayAsync().Result; stream.Write(buffer, 0, buffer.Length); } public void Serialize(HttpRequestMessage request, Stream stream) { byte[] assuranceBuffer = null; if (_bufferContent && request.Content != null) assuranceBuffer = request.Content.ReadAsByteArrayAsync().Result; // make sure it is buffered var httpMessageContent = new HttpMessageContent(request); var buffer = httpMessageContent.ReadAsByteArrayAsync().Result; stream.Write(buffer, 0, buffer.Length); } public HttpResponseMessage DeserializeToResponse(Stream stream) { var response = new HttpResponseMessage(); var memoryStream = new MemoryStream(); stream.CopyTo(memoryStream); response.Content = new ByteArrayContent(memoryStream.ToArray()); response.Content.Headers.Add("Content-Type", "application/http;msgtype=response"); return response.Content.ReadAsHttpResponseMessageAsync().Result; } public HttpRequestMessage DeserializeToRequest(Stream stream) { var request = new HttpRequestMessage(); var memoryStream = new MemoryStream(); stream.CopyTo(memoryStream); request.Content = new ByteArrayContent(memoryStream.ToArray()); request.Content.Headers.Add("Content-Type", "application/http;msgtype=request"); return request.Content.ReadAsHttpRequestMessageAsync().Result; } } }
var stream = new FileStream("Request.bin", FileMode.Open);
var serializer = new MessageContentHttpMessageSerializer();
var request = serializer.DeserializeToRequest(stream);
var memoryStream = new MemoryStream();
serializer.Serialize(request, memoryStream);
memoryStream.Position = 0;
var request2 = serializer.DeserializeToRequest(memoryStream);
Comments: This problem seems to not exist in current source and only in RTM. The code for HttpMessageContent has changed to allow dealing with UserAgent differently. _______________________________________________________________________________________________________ This is MessageContentHttpMessageSerializer: using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; using System.Text; namespace WebApiContrib.Serialization { public class MessageContentHttpMessageSerializer { private bool _bufferContent; public MessageContentHttpMessageSerializer() : this(false) { } public MessageContentHttpMessageSerializer(bool bufferContent) { _bufferContent = bufferContent; } public void Serialize(HttpResponseMessage response, Stream stream) { byte[] assuranceBuffer = null; if (_bufferContent && response.Content != null) assuranceBuffer = response.Content.ReadAsByteArrayAsync().Result; // make sure it is buffered var httpMessageContent = new HttpMessageContent(response); var buffer = httpMessageContent.ReadAsByteArrayAsync().Result; stream.Write(buffer, 0, buffer.Length); } public void Serialize(HttpRequestMessage request, Stream stream) { byte[] assuranceBuffer = null; if (_bufferContent && request.Content != null) assuranceBuffer = request.Content.ReadAsByteArrayAsync().Result; // make sure it is buffered var httpMessageContent = new HttpMessageContent(request); var buffer = httpMessageContent.ReadAsByteArrayAsync().Result; stream.Write(buffer, 0, buffer.Length); } public HttpResponseMessage DeserializeToResponse(Stream stream) { var response = new HttpResponseMessage(); var memoryStream = new MemoryStream(); stream.CopyTo(memoryStream); response.Content = new ByteArrayContent(memoryStream.ToArray()); response.Content.Headers.Add("Content-Type", "application/http;msgtype=response"); return response.Content.ReadAsHttpResponseMessageAsync().Result; } public HttpRequestMessage DeserializeToRequest(Stream stream) { var request = new HttpRequestMessage(); var memoryStream = new MemoryStream(); stream.CopyTo(memoryStream); request.Content = new ByteArrayContent(memoryStream.ToArray()); request.Content.Headers.Add("Content-Type", "application/http;msgtype=request"); return request.Content.ReadAsHttpRequestMessageAsync().Result; } } }