HttpContext.Response.Body.Position = 0 - “不支持指定的方法”错误

问题描述 投票:0回答:4

我设置了一些日志记录中间件,可以利用 HttpContext 获取并记录信息。

我需要将 HttpResponse.Body 的位置设置为 0 才能读取整个流,但是,无论我尝试什么,它都会抛出“不支持指定的方法”并失败。

这对我来说很奇怪,因为位置是直接构建到 HttpResponse.Body 中的,而且我之前已经成功使用过它。

我也尝试使用 HttpResponse.Body.Seek 得到相同的结果。

此时我陷入困境,任何帮助将不胜感激。

更新:一旦将response.body移动到新的内存流中,我就能够改变它的位置,但是,现在它返回一个空的主体。

public async Task Invoke(HttpContext context)
        {
            //Retrieve request & response
            var request = context.Request;
            var response = context.Response;

            if (request.Path != "/")
            {
                var reqBody = request.Body;
                var resBody = response.Body;
                string path = request.Path;
                string method = request.Method;
                string queryString = HttpUtility.UrlDecode(request.QueryString.ToString());
                int statusCode = context.Response.StatusCode;

                var buffer = new byte[Convert.ToInt32(request.ContentLength)];
                await request.Body.ReadAsync(buffer, 0, buffer.Length);
                var reqBodyText = Encoding.UTF8.GetString(buffer);
                request.Body = reqBody;

                var responseBodyStream = new MemoryStream();
                context.Response.Body = responseBodyStream;

                await _next(context);

                responseBodyStream.Seek(0, SeekOrigin.Begin);
                var resBodyText = new StreamReader(responseBodyStream).ReadToEnd();
                responseBodyStream.Seek(0, SeekOrigin.Begin);
                await responseBodyStream.CopyToAsync(context.Response.Body);

                ...
            }
        }
c# httpresponse httpcontext
4个回答
8
投票

根据解决此GitHub问题的评论,您需要启用缓冲

为此,请将以下代码段添加到您的

Startup.cs
Configure
方法中:

app.Use(async (context, next) =>
{
    context.Request.EnableBuffering();
    await next();
});

6
投票

我能够解决这个问题:

首先,我将响应设置为其自己的内存流,并在设置流后调用await _next(context):

using var responseBodyStream = new MemoryStream();
var previousBodyStream = context.Response.Body;
context.Response.Body = responseBodyStream;

await _next(context);

然后,一旦我这样做了,我注意到我得到了一个空的主体,这是由于尝试将一个空的主体设置回响应上下文:

responseBodyStream.Flush();
responseBodyStream.Seek(0, SeekOrigin.Begin);
await responseBodyStream.CopyToAsync(previousBodyStream);
context.Response.Body = previousBodyStream;

我删除了这条线,一切都开始正常工作。


1
投票

您可能在响应正文准备好之前访问它。 将任务调用(HttpContext 上下文)的执行推迟到执行管道中的后续步骤(准备好时)


1
投票

我今天在我的 Asp.Net core API 中遇到了这个问题。

问题是,我忘记将

[FromBody]
参数添加到我的 API 中。添加如下内容后,问题解决了。

[HttpPost("merkliste/create")]
public virtual async Task<IActionResult> MerklisteWorksheetCreate(string worksheetName, [FromBody] string elementDetailsArray)

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.