代码之家  ›  专栏  ›  技术社区  ›  Paw Baltzersen

读取HttpModule中的HTTP请求正文

  •  0
  • Paw Baltzersen  · 技术社区  · 7 年前

    我有一本书。NET核心Web API在IIS中运行。我想在IIS登录帖子中添加请求正文。所以进来。NET完整框架我用一个实现IHttpModule的类创建了类库。我必须使用。NET完整框架,因为IHttpModule不在核心中。

    我的问题是请求InputStream只能读取一次。因此,当我在代码中阅读它时,当它到达我的核心API时,流已经到达了它的末端(并且流对象已经被修改)。我已经尽了我所能,我已经搜索了很多。

    什么不起作用:

    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;
    

    最后一个标志应该告诉流保持打开状态,但对核心的调用仍然失败。

    context.HttpContext.Request.Body
    

    标准版中没有。网

    然后我试了一下:

    var s2 = new MemoryStream(request.TotalBytes);
    HttpContext.Current.Request.InputStream.CopyTo(s2);
    

    还是失败了。即使是这个小代码也会让它失败:

    var v = request.TotalBytes;
    

    我至今的想法

    查看流的源代码,我可以看到,在读取属性时,流的一些内部数据发生了更改,所以我认为是IIS在将消息发送到Kestrel之前确保消息未被篡改。有人能解释一下吗?也许你知道还有谁能完成这个任务?

    旁注: 是的,我可以使用其他IIS模块以其他方式获取正文消息,但他们不会将其放入标准IIS日志中,而是创建自己的日志。我已经在我的麋鹿堆栈中使用IIS日志,这就是为什么这样做会更容易。

    0 回复  |  直到 7 年前
        1
  •  0
  •   AthosXtreme    4 年前

    有点晚了,但我也处理了好几个小时。最终得到了使用

    request.GetBufferedInputStream()
    

    相反

    request.InputStream
    

    (.NET Framework 4.6)

    推荐文章