C# IIS/Owin如何将IHttpActionResult转换为应用程序/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

我正在探索IIS/Owin管道是如何工作的。我试图在管道中找到IIS/Owin使用的库/方法,以将IHttpActionResult(从控制器返回)转换为请求中存在的正确内容类型,如application/json

控制器-

[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);
        }
    }