我在IIS中运行一个.NET Core Web API。我想在POST的IIS日志中添加请求正文。因此,在.NET Full Framework中,我使用实现IHttpModule的单个类创建了类库。我必须使用.NET Full Framework,因为IHttpModule不在Core中。
我的问题是请求InputStream只能被读取一次。因此,当我在代码中读取它时,当流到达我的Core API时,流已经在它的末尾(并且Stream对象已被修改)。我已经尽力想想,并且进行了很多搜索。
什么不起作用:
var bytes = new byte[request.InputStream.Length];
request.InputStream.Read(bytes, 0, bytes.Length);
request.InputStream.Position = 0;
var content = Encoding.UTF8.GetString(bytes);
是的,我的身体还不错,但是流位置没有重置。重置职位无济于事。
var reader = new StreamReader(HttpContext.Current.Request.InputStream, Encoding.UTF8, true, 1024, true);
HttpContext.Current.Request.InputStream.Position = 0;
最后一个标志应该告诉流保持打开状态,但是对Core的调用仍然失败。
context.HttpContext.Request.Body
在标准.NET中不可用。
然后我尝试了这个:
var s2 = new MemoryStream(request.TotalBytes);
HttpContext.Current.Request.InputStream.CopyTo(s2);
仍然失败。即使是这么小的代码也会使其失败:
var v = request.TotalBytes;
到目前为止我的想法
查看流的源代码,我可以看到在读取属性时它的某些内部数据已更改,所以我在想的是,这是IIS确保在发送消息之前未对其进行篡改去红K。谁能对此有所启发?也许您知道另一个人能完成这项任务?
旁注:是的,我可以使用其他IIS模块以其他方式获取正文消息,但是它们没有将其放入标准IIS日志中,而是创建了自己的消息。我已经将IIS日志输入到我的ELK堆栈中,这就是为什么这样做会更简单。