HttpContext.Response.Body.Position = 0 - "Specified method is not supported" 错误
HttpContext.Response.Body.Position = 0 - "Specified method is not supported" error
我安装了一些日志记录中间件,可以利用 HttpContext 抓取和记录信息。
我需要将 HttpResponse.Body 的位置设置为 0 才能读取整个流,但是,无论我尝试什么,它都会抛出 "Specified method is not supported" 并失败。
这对我来说很奇怪,因为 position 是内置在 HttpResponse.Body 中的,我以前成功地使用过它。
我也试过用HttpResponse.Body。搜索也是一样的结果。
此时我被卡住了,任何帮助将不胜感激。
更新:一旦我将它移动到一个新的内存流中,我就能够改变 response.body 的位置,但是,现在它 returns 一个空的 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);
...
}
}
您可能在响应正文准备好之前访问它。
将任务调用(HttpContext 上下文)的执行推迟到执行管道中更晚的步骤(准备就绪时)
我能够解决这个问题:
首先,我将响应设置为它自己的内存流,并在设置流后调用 await _next(context):
var responseBodyStream = new MemoryStream();
context.Response.Body = responseBodyStream;
await _next(context);
然后一旦我这样做,我注意到我得到一个空的 body 返回,这是因为试图将一个空的 body 返回设置为响应上下文:
await responseBodyStream.CopyToAsync(context.Response.Body);
我删除了这一行,一切都开始正常工作了。
今天我的 Asp.Net 核心 API 遇到了这个问题。
问题是,我忘记将 [FromBody]
参数添加到我的 API。添加如下内容后,问题解决
[HttpPost("merkliste/create")]
public virtual async Task<IActionResult> MerklisteWorksheetCreate(string worksheetName, [FromBody] string elementDetailsArray)
希望对您有所帮助。
根据解决此问题的评论 GitHub issue,您需要启用缓冲。
为此,请将以下代码段添加到您的 Startup.cs
Configure
方法中:
app.Use(async (context, next) =>
{
context.Request.EnableBuffering();
await next();
});
我安装了一些日志记录中间件,可以利用 HttpContext 抓取和记录信息。
我需要将 HttpResponse.Body 的位置设置为 0 才能读取整个流,但是,无论我尝试什么,它都会抛出 "Specified method is not supported" 并失败。
这对我来说很奇怪,因为 position 是内置在 HttpResponse.Body 中的,我以前成功地使用过它。
我也试过用HttpResponse.Body。搜索也是一样的结果。
此时我被卡住了,任何帮助将不胜感激。
更新:一旦我将它移动到一个新的内存流中,我就能够改变 response.body 的位置,但是,现在它 returns 一个空的 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);
...
}
}
您可能在响应正文准备好之前访问它。 将任务调用(HttpContext 上下文)的执行推迟到执行管道中更晚的步骤(准备就绪时)
我能够解决这个问题:
首先,我将响应设置为它自己的内存流,并在设置流后调用 await _next(context):
var responseBodyStream = new MemoryStream();
context.Response.Body = responseBodyStream;
await _next(context);
然后一旦我这样做,我注意到我得到一个空的 body 返回,这是因为试图将一个空的 body 返回设置为响应上下文:
await responseBodyStream.CopyToAsync(context.Response.Body);
我删除了这一行,一切都开始正常工作了。
今天我的 Asp.Net 核心 API 遇到了这个问题。
问题是,我忘记将 [FromBody]
参数添加到我的 API。添加如下内容后,问题解决
[HttpPost("merkliste/create")]
public virtual async Task<IActionResult> MerklisteWorksheetCreate(string worksheetName, [FromBody] string elementDetailsArray)
希望对您有所帮助。
根据解决此问题的评论 GitHub issue,您需要启用缓冲。
为此,请将以下代码段添加到您的 Startup.cs
Configure
方法中:
app.Use(async (context, next) =>
{
context.Request.EnableBuffering();
await next();
});