在HttpModule中读取HTTP请求正文

时间:2019-01-14 07:37:04

标签: c# iis logging stream kestrel

我在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堆栈中,这就是为什么这样做会更简单。

0 个答案:

没有答案