HttpMessageContent serializes HTTP requests/responses inside a mulitpart/mixed body.
For requests, it sends the header Content-Type: application/http; msgtype=request.
For responses, it expects the header Content-Type: application/http; msgtype=response.
This is where msgtype=request is added in source:
|
Headers.ContentType.Parameters.Add(new NameValueHeaderValue(MsgTypeParameter, DefaultRequestMsgType)); |
This is where msgtype=response is validated in source:
|
foreach (NameValueHeaderValue parameter in contentType.Parameters) |
|
{ |
|
if (parameter.Name.Equals(MsgTypeParameter, StringComparison.OrdinalIgnoreCase)) |
|
{ |
|
string msgType = FormattingUtilities.UnquoteToken(parameter.Value); |
|
if (!msgType.Equals(isRequest ? DefaultRequestMsgType : DefaultResponseMsgType, StringComparison.OrdinalIgnoreCase)) |
|
{ |
|
if (throwOnError) |
|
{ |
|
throw Error.Argument("content", Properties.Resources.HttpMessageInvalidMediaType, FormattingUtilities.HttpContentType.Name, isRequest ? DefaultRequestMediaType : DefaultResponseMediaType); |
|
} |
|
else |
|
{ |
|
return false; |
|
} |
|
} |
|
|
|
return true; |
|
} |
|
} |
|
} |
|
|
|
if (throwOnError) |
|
{ |
|
throw Error.Argument("content", Properties.Resources.HttpMessageInvalidMediaType, FormattingUtilities.HttpContentType.Name, isRequest ? DefaultRequestMediaType : DefaultResponseMediaType); |
|
} |
|
else |
|
{ |
|
return false; |
|
} |
HttpMessageContent should be configurable to not sent a msgtype parameter, and accept responses without a msgtype (given Content-Type: application/http).
As a common real-world example, the OData specification uses Content-Type: application/http without any further msgtype in both its batched requests and responses, see:
https://www.odata.org/documentation/odata-version-2-0/batch-processing/
Inside Microsoft, Dataverse exposes OData services and its batching endpoint is unusable with HttpMessageContent because:
- Dataverse throws when a batch has
msgtype=request in its Content-Type;
ReadAsHttpResponseMessageAsync() throws when parsing Dataverse response because it does not have msgtype=response.
HttpMessageContentserializes HTTP requests/responses inside amulitpart/mixedbody.For requests, it sends the header
Content-Type: application/http; msgtype=request.For responses, it expects the header
Content-Type: application/http; msgtype=response.This is where
msgtype=requestis added in source:AspNetWebStack/src/System.Net.Http.Formatting/HttpMessageContent.cs
Line 68 in 1231b77
This is where
msgtype=responseis validated in source:AspNetWebStack/src/System.Net.Http.Formatting/HttpMessageContent.cs
Lines 142 to 171 in 1231b77
HttpMessageContentshould be configurable to not sent amsgtypeparameter, and accept responses without amsgtype(givenContent-Type: application/http).As a common real-world example, the OData specification uses
Content-Type: application/httpwithout any furthermsgtypein both its batched requests and responses, see:https://www.odata.org/documentation/odata-version-2-0/batch-processing/
Inside Microsoft, Dataverse exposes OData services and its batching endpoint is unusable with
HttpMessageContentbecause:msgtype=requestin itsContent-Type;ReadAsHttpResponseMessageAsync()throws when parsing Dataverse response because it does not havemsgtype=response.