Asp.net web api .NET Web Api日志记录响应主体

Asp.net web api .NET Web Api日志记录响应主体,asp.net-web-api,Asp.net Web Api,我正在尝试使用DelegatingHandler记录Web Api响应主体 protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { return base.SendAsync(reques

我正在尝试使用DelegatingHandler记录Web Api响应主体

    protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        return base.SendAsync(request, cancellationToken).ContinueWith(task =>
        {
            var response = task.Result;
            LogResponseLoggingInfo(response);
            return response;
        });
    }

    private void LogResponseLoggingInfo(HttpResponseMessage response)
    {
        string responseBody = string.Empty;

        if (response.Content != null)
        {
            responseBody = response.Content.ReadAsStringAsync().Result;
            //WriteToLogFile(responseBody);
        }
    }
受保护的覆盖System.Threading.Tasks.Task SendAsync(HttpRequestMessage请求,System.Threading.CancellationToken CancellationToken)
{
返回base.sendaync(请求,取消令牌).ContinueWith(任务=>
{
var response=task.Result;
LogResponseLogginInfo(响应);
返回响应;
});
}
专用无效日志响应LogginInfo(HttpResponseMessage响应)
{
string responseBody=string.Empty;
if(response.Content!=null)
{
responseBody=response.Content.ReadAsStringAsync().Result;
//写入日志文件(响应库);
}
}
只要对Web Api的调用返回响应,它就可以正常工作。StatusCode等于HttpStatusCode.OK

但是,任何返回任何其他状态代码(例如未经授权)的调用都会导致正确响应401仅在每次其他调用时正确返回

其他时候,我收到一个500响应,内部服务器错误

使用Fiddler查看500个错误的原始响应显示,带有服务器的HTML文档在发送HTTP头后无法追加头

如果我注释掉responseBody=response.Content.ReadAsStringAsync().Result行,每次都成功返回正确的401错误响应


有人知道导致错误的原因以及如何修复吗?

尝试将处理程序改为使用async/await:

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,       System.Threading.CancellationToken cancellationToken)
    {
        var response = await base.SendAsync(request, cancellationToken);

        await LogResponseLoggingInfo(response);

        return response;
    }

    private async Task LogResponseLoggingInfo(HttpResponseMessage response)
    {
        string responseBody = string.Empty;

        if (response.Content != null)
        {
            responseBody = await response.Content.ReadAsStringAsync();
            //WriteToLogFile(responseBody);
        }
    }       
protected override async Task sendaync(HttpRequestMessage请求,System.Threading.CancellationToken CancellationToken)
{
var response=await base.sendaync(请求、取消令牌);
等待LogResponseLogginInfo(响应);
返回响应;
}
专用异步任务LogResponseLogginInfo(HttpResponseMessage响应)
{
string responseBody=string.Empty;
if(response.Content!=null)
{
responseBody=wait response.Content.ReadAsStringAsync();
//写入日志文件(响应库);
}
}       

不要使用.ContinueWith和.Result,因为如果使用async/Wait,您将不需要它。这里有一些更多的信息:

我修改了处理程序以使用上面的异步/等待代码,但我仍然得到相同的错误。只添加了这个处理程序,就可以在新的Web API项目上轻松复制错误。嗯,我无法重现这个问题。代码是否仍在
wait response.Content.ReadAsStringAsync()处引发异常