C# IIS/Owin如何将IHttpActionResult转换为应用程序/json?
我正在探索IIS/Owin管道是如何工作的。我试图在管道中找到IIS/Owin使用的库/方法,以将IHttpActionResult(从控制器返回)转换为请求中存在的正确内容类型,如application/json 控制器-C# IIS/Owin如何将IHttpActionResult转换为应用程序/json?,c#,asp.net,iis-7,asp.net-web-api2,owin,C#,Asp.net,Iis 7,Asp.net Web Api2,Owin,我正在探索IIS/Owin管道是如何工作的。我试图在管道中找到IIS/Owin使用的库/方法,以将IHttpActionResult(从控制器返回)转换为请求中存在的正确内容类型,如application/json 控制器- [Route("")] public IHttpActionResult Get() { IEnumerable<Product> productList = ProductService.GetAllProducts(); if (!produ
[Route("")]
public IHttpActionResult Get()
{
IEnumerable<Product> productList = ProductService.GetAllProducts();
if (!productList.Any())
return Ok();
return Json(productList, new JsonSerializerSettings
{
ContractResolver = new WebContractResolver(),
Converters = new List<JsonConverter> { new TrimStringDataConverter() }
});
}
当从IHttpActionResult转换为application/json时?
IHttpActionResult
有一个方法ExecuteAsync
,该方法返回HttpResponseMessage
public interface IHttpActionResult
{
Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
}
在Owin
中有一个HttpMessageHandlerAdapter
类,该类具有一个SendResponseMessageAsync
方法,该方法将HttpResponseMessage
返回给客户端。以下是github的来源:
专用任务SendResponseMessageAsync(HttpRequestMessage请求、HttpResponseMessage响应、,
IOwinResponse owinResponse,CancellationToken CancellationToken)
{
owinResponse.StatusCode=(int)response.StatusCode;
owinResponse.ReasonPhrase=response.ReasonPhrase;
//复制非内容标题
IDictionary responseHeaders=owinResponse.Headers;
foreach(响应中的KeyValuePair标头.Headers)
{
responseHeaders[header.Key]=header.Value.AsArray();
}
HttpContent responseContent=response.Content;
if(responseContent==null)
{
SetHeadersForEmptyResponse(负责人);
返回TaskHelpers.Completed();
}
其他的
{
//复制内容标题
foreach(responseContent.Headers中的KeyValuePair contentHeader)
{
responseHeaders[contentHeader.Key]=contentHeader.Value.AsArray();
}
//复制体
返回SendResponseContentAsync(请求、响应、owinResponse、取消令牌);
}
}
ihttpackationresult
有一个方法ExecuteAsync
,它返回HttpResponseMessage
public interface IHttpActionResult
{
Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
}
在Owin
中有一个HttpMessageHandlerAdapter
类,该类具有一个SendResponseMessageAsync
方法,该方法将HttpResponseMessage
返回给客户端。以下是github的来源:
专用任务SendResponseMessageAsync(HttpRequestMessage请求、HttpResponseMessage响应、,
IOwinResponse owinResponse,CancellationToken CancellationToken)
{
owinResponse.StatusCode=(int)response.StatusCode;
owinResponse.ReasonPhrase=response.ReasonPhrase;
//复制非内容标题
IDictionary responseHeaders=owinResponse.Headers;
foreach(响应中的KeyValuePair标头.Headers)
{
responseHeaders[header.Key]=header.Value.AsArray();
}
HttpContent responseContent=response.Content;
if(responseContent==null)
{
SetHeadersForEmptyResponse(负责人);
返回TaskHelpers.Completed();
}
其他的
{
//复制内容标题
foreach(responseContent.Headers中的KeyValuePair contentHeader)
{
responseHeaders[contentHeader.Key]=contentHeader.Value.AsArray();
}
//复制体
返回SendResponseContentAsync(请求、响应、owinResponse、取消令牌);
}
}
public virtual Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
return Task.FromResult(Execute());
}
private HttpResponseMessage Execute()
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
try
{
ArraySegment<byte> segment = Serialize();
response.Content = new ByteArrayContent(segment.Array, segment.Offset, segment.Count);
MediaTypeHeaderValue contentType = new MediaTypeHeaderValue("application/json");
contentType.CharSet = _encoding.WebName;
response.Content.Headers.ContentType = contentType;
response.RequestMessage = _dependencies.Request;
}
catch
{
response.Dispose();
throw;
}
return response;
}
private Task SendResponseMessageAsync(HttpRequestMessage request, HttpResponseMessage response,
IOwinResponse owinResponse, CancellationToken cancellationToken)
{
owinResponse.StatusCode = (int)response.StatusCode;
owinResponse.ReasonPhrase = response.ReasonPhrase;
// Copy non-content headers
IDictionary<string, string[]> responseHeaders = owinResponse.Headers;
foreach (KeyValuePair<string, IEnumerable<string>> header in response.Headers)
{
responseHeaders[header.Key] = header.Value.AsArray();
}
HttpContent responseContent = response.Content;
if (responseContent == null)
{
SetHeadersForEmptyResponse(responseHeaders);
return TaskHelpers.Completed();
}
else
{
// Copy content headers
foreach (KeyValuePair<string, IEnumerable<string>> contentHeader in responseContent.Headers)
{
responseHeaders[contentHeader.Key] = contentHeader.Value.AsArray();
}
// Copy body
return SendResponseContentAsync(request, response, owinResponse, cancellationToken);
}
}