代码之家  ›  专栏  ›  技术社区  ›  expenguin

httpcontext.response.body.position=0-“不支持指定的方法”错误

  •  1
  • expenguin  · 技术社区  · 7 年前

    我已经安装了一些日志中间件,可以利用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 回复  |  直到 6 年前
        1
  •  2
  •   expenguin    7 年前

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

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

        2
  •  0
  •   X.Otano    7 年前

        3
  •  0
  •   Sibeesh Venu    6 年前

    [FromBody]

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

    enter image description here