c# - HttpContext.Response.Body.Position = 0 - “不支持指定的方法”错误
问题描述
我已经设置了一些日志中间件,这些中间件使用 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);
...
}
}
解决方案
我能够解决这个问题:
首先,我将响应设置为它自己的内存流,并在设置流后调用 await _next(context):
var responseBodyStream = new MemoryStream();
context.Response.Body = responseBodyStream;
await _next(context);
然后,一旦我这样做了,我注意到我得到了一个空的身体,这是由于试图将一个空的身体设置为响应上下文:
await responseBodyStream.CopyToAsync(context.Response.Body);
我删除了这条线,一切都开始正常工作。
推荐阅读
- css - 为什么 3 列不填充父 div?(使用显示:表格)
- neo4j - 升级 neo4j 次要版本
- php - 如何在php中合并由foreach循环生成的2个数组
- git - TortoiseGit 显示修改后的文件,这些文件是二进制相同的(未修改),但不会出现在 git status 中
- ansible - 在 Linux Centos 6 中使用 Ansible 或 Terraform 提供服务
- python - 如何在使用 ORM 的 django 中使用值左侧的注释(别名)字段作为分组依据(即值)子句的一部分?
- java - 在什么情况下强制转换 ArrayList
.toArray() 到 (Type[]) 有可能出现“类转换错误” - flutter - 使用颤振在应用程序内重置密码
- android - io.reactivex -> android.os.NetworkOnMainThreadException
- javascript - 通过 ajax 调用加载 html 时未应用 Css