【发布时间】:2018-12-12 04:27:23
【问题描述】:
我已经设置了一些日志中间件,可以利用 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);
...
}
}
【问题讨论】:
-
你什么时候调用这个方法?
-
响应流只转发。一读就是这样。用您控制的方式替换流。这个中间件用的是什么平台?
-
@Badulake 每次有 HTTP 请求时都会调用它。
-
@Nksoi 这是在 .Net Core 中。我不确定您所说的“用您控制的方式替换流”是什么意思
-
我需要更多信息才能知道确切的执行时间。 appstart方法,页面加载?ihttphandler?when??
标签: c# httpresponse httpcontext