首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpContent.ReadAsStringAsync导致请求挂起

HttpContent.ReadAsStringAsync导致请求挂起
EN

Stack Overflow用户
提问于 2019-12-14 03:52:13
回答 1查看 372关注 0票数 0

在ASP.NET WebAPi 2代码中,我有一个委托处理程序

代码语言:javascript
复制
public class RequestHandler1 : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var formData2 = await ReadContent(request);
        return await base.SendAsync(request, cancellationToken);
    }

    private static async Task<string> ReadContent(HttpRequestMessage request)
    {
        using (var ms = new MemoryStream())
        {
            await request.Content.CopyToAsync(ms);
            ms.Seek(0, SeekOrigin.Begin);

            using (var sr = new StreamReader(ms, Encoding.UTF8, true, 100, true))
            {
                return sr.ReadToEnd();
            }
        }
    }

    private static async Task<string> ReadContent3(HttpRequestMessage request)
    {
        var text = await request.Content.ReadAsStringAsync();
        return text;
    }
}

这个问题与HttpContent.ReadAsStringAsync causes request to hang (or other strange behaviours)有关,但在那个帖子中从来没有得到正确的回答。

当我调用return await base.SendAsync(request, cancellationToken);时,它就挂了。我是调用ReadContent还是ReadContent3都无关紧要

还有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2020-02-07 18:21:59

试试这段代码

代码语言:javascript
复制
public class CustomLogHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var logMetadata = await BuildRequestMetadata(request);
        var response = await base.SendAsync(request, cancellationToken);
        logMetadata = await BuildResponseMetadata(logMetadata, response);
        await SendToLog(logMetadata);
        return response;
    }
    private async Task<LogMetadata> BuildRequestMetadata(HttpRequestMessage request)
    {
        LogMetadata log = new LogMetadata
        {
            RequestMethod = request.Method.Method,
            RequestTimestamp = DateTime.Now,
            RequestUri = request.RequestUri.ToString(),
            RequestContent = await request.Content.ReadAsStringAsync(),
        };
        return log;
    }
    private async Task<LogMetadata> BuildResponseMetadata(LogMetadata logMetadata, HttpResponseMessage response)
    {
        logMetadata.ResponseStatusCode = response.StatusCode;
        logMetadata.ResponseTimestamp = DateTime.Now;
        logMetadata.ResponseContentType = response.Content == null ? string.Empty : response.Content.Headers.ContentType.MediaType;
        logMetadata.Response = await response.Content.ReadAsStringAsync();
        return logMetadata;
    }
    private async Task<bool> SendToLog(LogMetadata logMetadata)
    {
        try
        {
            //write your code
        }
        catch
        {
            return false;
        }
        return true;
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59328972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档