如果指定路径中存在文件,则忽略 web.Config 中 system.webServer 中的处理程序

Handler in system.webServer in web.Config is ignored if a file exist at the path specified

我有一个处理程序,我想处理所有流量,包括文件等

但是一旦 URL 匹配物理文件的位置,例如 "someFile/test.cshtml",它就会忽略我的处理程序和 BeginProcessRequest,在这种情况下,甚至会使用 RazorEngine 以某种方式呈现 cshtml ?

但是我怎样才能防止这种行为并确保所有请求都由我的处理程序处理?

这是我的全部web.Config

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0"/>
    <httpHandlers>
      <clear />
      <add verb="*" type="SimpleWebServer.HttpHandler" path="*"/>
    </httpHandlers>
  </system.web>
  <system.webServer>
    <handlers>
      <clear />
      <add name="CatchAll" verb="*" type="SimpleWebServer.HttpHandler" path="*" resourceType="Unspecified" allowPathInfo="true"  />
    </handlers>
    <modules runAllManagedModulesForAllRequests="true"/>
    <validation validateIntegratedModeConfiguration="false"/>
  </system.webServer>
</configuration>

还有我的 Http 处理程序:

namespace SimpleWebServer
{
    public class HttpHandler : IHttpAsyncHandler
    {
        ...
        public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback callback, Object extraData)
        {
            return AsyncResult.GetAsyncResult(context, callback);
        }
        ...
    }
}

使用 HttpModule 而不是 HttpHandler。模块在管道中较早执行。因此,您不需要与主机 IIS 中的现有处理程序竞争。

HttpModule

namespace SimpleWebServer
{
    public class CustomHttpModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.BeginRequest += 
                this.BeginRequest;
            context.EndRequest += 
                this.EndRequest;
        }

        private void BeginRequest(Object source, 
            EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;
            // do something 
        }

        private void EndRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;
            // do something 
        }

        public void Dispose()
        {
        }
    }
}

Web.Config

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0"/>
  </system.web>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <add name="CatchAll" type="SimpleWebServer.CustomHttpModule"/>
    </modules>
  </system.webServer>
</configuration>