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

时间:2018-07-03 19:23:47

标签: c# httpresponse httpcontext

我已经安装了一些日志记录中间件,可以使用HttpContext捕获和记录信息。

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

这对我来说很奇怪,因为HttpResponse.Body内建了位置,并且在成功之前我已经使用过它。

我还尝试过将HttpResponse.Body.Seek与相同的结果一起使用。

在这一点上,我很困,不胜感激。

更新:一旦将response.body位置移动到新的内存流中,我就能够更改它的位置,但是现在它返回了一个空的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);

                ...
            }
        }

3 个答案:

答案 0 :(得分:1)

我能够解决这个问题:

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

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

await _next(context);

然后,一旦执行此操作,我发现我得到了一个空的主体,这是由于试图将一个空的主体设置为响应上下文:

await responseBodyStream.CopyToAsync(context.Response.Body);

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

答案 1 :(得分:0)

您可能正在准备响应之前访问响应正文。 将Task Invoke(HttpContext上下文)的执行推迟到执行管道中的后续步骤(就绪时)

答案 2 :(得分:0)

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

enter image description here

问题是,我忘记将[FromBody]参数添加到我的API中。添加如下内容后,问题已解决。

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

enter image description here

希望有帮助。