C# 在Web API 2中处理标头请求时的内容长度为0

C# 在Web API 2中处理标头请求时的内容长度为0,c#,asp.net,asp.net-web-api,http-headers,asp.net-web-api2,C#,Asp.net,Asp.net Web Api,Http Headers,Asp.net Web Api2,我想在我的WebAPI2应用程序中处理HEAD请求。我从StrathWeb的博客文章中复制粘贴了代码: 我得到的答复如下: HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache Content-Length: 0 Content-Type: application/json; charset=utf-8 Expires: -1 Server: Microsoft-IIS/10.0 X-AspNet-Version: 4.0.30319

我想在我的WebAPI2应用程序中处理HEAD请求。我从StrathWeb的博客文章中复制粘贴了代码:

我得到的答复如下:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 0
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcc2ltb25lXERvY3VtZW50c1xTaW1vbnNEb2N1bWVudHNcSVRcQyNcRGVtb0NvZGVcUkVTVGZ1bFdlYlNlcnZpY2VDbGllbnRERU1PXEJvb2tTZXJ2aWNlXGFwaVxib29rc1w1?=
X-Powered-By: ASP.NET
Date: Sun, 19 Feb 2017 12:09:52 GMT
内容长度为0,但应为104字节

当我向HeadHandler添加一个断点并逐步遍历代码时,它似乎在返回响应之前将Content Length头值正确设置为104字节


在HeadHandler之后运行的管道中是否还有其他步骤,该步骤识别响应没有正文,并将内容长度设置为0?在添加HeadHandler之后,WebApiConfig.cs中的唯一内容是HttpAttribute路由的映射和默认路由的设置,在我看来,这两者都不可能导致内容长度头被重置。或者,某个地方的配置设置可能会影响响应中返回的内容长度吗?

您只需设置响应的Content.Headers的内容长度-无需为响应创建新内容。请求HEAD的行为会从响应中删除主体内容

这可能是你引用的文章(2013年)之后的一个变化,不再需要从头开始创建内容

这就是你所需要的:

public class HeadHandler : DelegatingHandler
{
    private const string Head = "IsHead";

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        if (request.Method == HttpMethod.Head)
        {
            request.Method = HttpMethod.Get;
            request.Properties.Add(Head, true);
        }

        var response = await base.SendAsync(request, cancellationToken);

        object isHead;
        response.RequestMessage.Properties.TryGetValue(Head, out isHead);

        if (isHead != null && ((bool)isHead))
        {
            var oldContent = await response.Content.ReadAsByteArrayAsync();

            response.Content.Headers.ContentLength = oldContent.Length;
            return response;
        }

        return response;
    }
}
public类头处理程序:DelegatingHandler
{
private const string Head=“IsHead”;
受保护的重写异步任务SendAsync(HttpRequestMessage请求,System.Threading.CancellationToken CancellationToken)
{
if(request.Method==HttpMethod.Head)
{
request.Method=HttpMethod.Get;
request.Properties.Add(Head,true);
}
var response=await base.sendaync(请求、取消令牌);
对象isHead;
response.RequestMessage.Properties.TryGetValue(Head,out-isHead);
如果(isHead!=null&((bool)isHead))
{
var oldContent=await response.Content.ReadAsByteArrayAsync();
response.Content.Headers.ContentLength=oldContent.Length;
返回响应;
}
返回响应;
}
}

您是否尝试为HttpResponseMessage设置标题,而不是发送回客户端的内容标题?@Chizh:我不知道您的意思。据我所知,内容长度头仅在HttpResponseMessage.Content.Headers中定义,而不是在HttpResponseMessage.Headers中定义。在
返回响应上设置断点行,我验证了在代码从SendAsync方法返回时,HttpResponseMessage.Content.Headers.ContentLength设置为104字节。但是您是否尝试过
response.Headers.Add(“Content Length”,Int32.MaxValue)
?问题是,当发出响应时,必须使用
HttpResponseMessage.Content.Headers.ContentLength生成Content-Length头,但实际内容长度为零
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 0
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcc2ltb25lXERvY3VtZW50c1xTaW1vbnNEb2N1bWVudHNcSVRcQyNcRGVtb0NvZGVcUkVTVGZ1bFdlYlNlcnZpY2VDbGllbnRERU1PXEJvb2tTZXJ2aWNlXGFwaVxib29rc1w1?=
X-Powered-By: ASP.NET
Date: Sun, 19 Feb 2017 12:09:52 GMT
public class HeadHandler : DelegatingHandler
{
    private const string Head = "IsHead";

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        if (request.Method == HttpMethod.Head)
        {
            request.Method = HttpMethod.Get;
            request.Properties.Add(Head, true);
        }

        var response = await base.SendAsync(request, cancellationToken);

        object isHead;
        response.RequestMessage.Properties.TryGetValue(Head, out isHead);

        if (isHead != null && ((bool)isHead))
        {
            var oldContent = await response.Content.ReadAsByteArrayAsync();

            response.Content.Headers.ContentLength = oldContent.Length;
            return response;
        }

        return response;
    }
}