简体   繁体   English

Web API请求内容为空

[英]Web API request content empty

I have a DelegatingHandler implementation to log request/response content: 我有一个DelegatingHandler实现来记录请求/响应内容:

public class RequestAndResponseLoggerDelegatingHandler : DelegatingHandler
{
    public IDataAccess Data { get; set; }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var started = DateTime.UtcNow;
        var response = await base.SendAsync(request, cancellationToken);
        await Log(started, request, response);
        return response;
    }

    private async Task Log(DateTime start, HttpRequestMessage request, HttpResponseMessage response)
    {
        var finished = DateTime.UtcNow;
        var requestContent = await request.Content.ReadAsStringAsync();
        var responseContent = await response.Content.ReadAsStringAsync();
        var info = new ApiLogEntry(start, finished, requestContent, responseContent, request, response);
        Data.Log(info);
    }
}

but for some reason requestContent is coming up empty. 但由于某种原因, requestContent即将出现。 request.Content.Length is confirming that there is content, it's just not being extracted. request.Content.Length确认有内容,它只是没有被提取。

Any ideas? 有任何想法吗?

The request body stream is read and bound into parameters and as a result of binding, the stream has been positioned to the end. 读取请求主体流并将其绑定到参数中,并且作为绑定的结果,流已经定位到最后。 That is why it is coming as empty. 这就是它变得空洞的原因。 If you seek to the beginning before request.Content.ReadAsStringAsync() , it should work. 如果你在request.Content.ReadAsStringAsync()之前寻找开头,它应该工作。 Instead of that, you can simply read the request body first before binding happens, some thing like this. 而不是那样,你可以在绑定发生之前先简单地读取请求体,有些事情是这样的。

public class RequestAndResponseLoggerDelegatingHandler : DelegatingHandler
{
    public IDataAccess Data { get; set; }

    protected override async Task<HttpResponseMessage> SendAsync(
                            HttpRequestMessage request, 
                                 CancellationToken cancellationToken)
    {
        var started = DateTime.UtcNow;
        var requestContent = await request.Content.ReadAsStringAsync();

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

        var responseContent = await response.Content.ReadAsStringAsync();
        await Log(started, request, response, requestContent, responseContent);
        return response;
    }

    private async Task Log(DateTime start, HttpRequestMessage request, 
                             HttpResponseMessage response, string requestContent, 
                                string responseContent)
    {
        var finished = DateTime.UtcNow;           
        var info = new ApiLogEntry(start, finished, requestContent, responseContent, 
                                        request, response);
        Data.Log(info);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM