IIS两次调用HttpModule的BeginRequest。这是一个错误吗?

时间:2017-02-08 13:25:08

标签: c# asp.net .net iis web

步骤

  1. 创建空的干净的ASP.NET Web App - " MyApp"。取消选择所有选项。
  2. 创建HttpModule - " MyHttpModule" (通过MSDN示例):

    using System;
    using System.Web;
    
    public class MyHttpModule : IHttpModule
    {
        public MyHttpModule() { }
    
        public string ModuleName { get { return "MyHttpModule"; } }
        public void Dispose() { }
    
        public void Init(HttpApplication app)
        {
            app.BeginRequest += ProcessBeginRequest;
        }
    
        private void ProcessBeginRequest(object source, EventArgs e)
        {
            var ctx = ((HttpApplication)source).Context;
    
            if (ctx.Request.Path == "/favicon.ico") { return; } // This stuff is handled automatically in current IIS version. So, I wrote this line just in case.
    
            ctx.Response.Write("Processing request from: " + ctx.Request.Url + "<br />");
            ctx.Response.Flush();
        }
    }
    
  3. 将其包含在web.config中:

    <system.webServer>     <modules>       <add name="MyHttpModule" type="MyHttpModule, MyApp"/>     </modules>   </system.webServer>

  4. 运行应用

  5. 浏览器显示BeginRequest侦听器已被触发两次 单个http请求:

  6. Singe http request execution with profiler

    尝试

    1. LogRequest事件侦听器按预期执行。但这不是http处理工作的正确名称监听器
    2. 像这样的变化没有结果:

      app.BeginRequest -= ProcessBeginRequest;
      app.BeginRequest += ProcessBeginRequest;
      
    3. 不是favicon.ico的事情
    4. 问题

      为什么单个http请求的事件处理程序被调用了两次?

      使用IIS启动任何低级别http请求处理有多大风险? (这不仅仅是记录)

      PS: 浏览互联网后,我认为这是IIS漏洞。我错了吗? 当然,对于http请求的低级处理和最大性能,最好自我托管应用程序或使用一些准备好的组件来自我托管像Katana。 但我想知道IIS是否可以安全地扩展这些东西?因为我对它有一种不好的感觉,因为现在它告诉我不要超出http级别,只做日志并只使用IIS配置。

0 个答案:

没有答案