【问题标题】:Request is null after read in Asp.net core custom Middleware在 Asp.net 核心自定义中间件中读取后请求为空
【发布时间】:2016-11-17 06:57:32
【问题描述】:

我发现asp.net核心自定义中间件中的请求只能读取一次,之后我必须手动将请求设置回Request.Body。这是阅读请求的推荐方式吗?

public async Task Invoke(HttpContext context)
{
    var request = context.Request;
    string xmlstring;
    using (System.IO.MemoryStream m = new System.IO.MemoryStream())
    {
        try
        {
            if (request.Body.CanSeek == true) request.Body.Position = 0;
            request.Body.CopyTo(m); 
            xmlstring = System.Text.Encoding.UTF8.GetString(m.ToArray());
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    context.Request.Body = new MemoryStream(Encoding.UTF8.GetBytes(xmlstring));
    await _next.Invoke(context);
}

我尝试将流“复制”到另一个流,但没有帮助。我怀疑所有自定义中间件都有设置请求正文的步骤,所以在这里询问我是否以正确的方式进行。

【问题讨论】:

    标签: c# asp.net-core


    【解决方案1】:

    正确的步骤应该是:

    1. 启用倒带
    2. 从正文中读取
    3. 倒带

    请注意:如果不将body设置回originalRequestBody,它只会工作一次,如果你再次尝试调用相同的web api,它会失败。

    请看下面的示例代码

        public async Task Invoke(HttpContext context)
        {
    
    
            var originalRequestBody = context.Request.Body;
    
            context.Request.EnableRewind();
    
            try
            {
    
    
                using (System.IO.MemoryStream m = new MemoryStream())
                {
                    context.Request.Body.CopyTo(m);
    
                    var s = System.Text.Encoding.UTF8.GetString(m.ToArray());
                }
    
                //this line will rewind the request body, so it could be read again
                context.Request.Body.Position = 0;
    
                await _next(context);
            }
            catch (Exception ex)
            {
    
            }
            finally
            {
                //important, otherwise, even current request will succeed, following request will fail
                context.Request.Body = originalRequestBody;
            }
    
        }
    

    【讨论】:

    • 我建议在一个虚拟项目中测试这个解决方案,而不是复制/粘贴到您现有的项目中。先证明理论,然后找出它在实际项目中不起作用的原因
    猜你喜欢
    • 2020-03-23
    • 1970-01-01
    • 2020-10-16
    • 2017-03-22
    • 2020-07-24
    • 2021-08-21
    • 2018-03-11
    • 1970-01-01
    相关资源
    最近更新 更多