【问题标题】:Exclude certain pages from using a HTTPModule排除某些页面使用 HTTPModule
【发布时间】:2008-09-16 10:15:35
【问题描述】:

有没有一种很好的方法可以排除某些页面使用 HTTP 模块?

我有一个使用自定义 HTTP 模块来验证会话的应用程序。 HTTPModule 在 web config 中是这样设置的:

<system.web>
  <!-- ... -->
  <httpModules>
    <add name="SessionValidationModule"
       type="SessionValidationModule, SomeNamespace" />
  </httpModules>
</system.web>

为了从页面中排除模块,我尝试这样做(没有成功):

<location path="ToBeExcluded">
  <system.web>
    <!-- ... -->
    <httpModules>
      <remove name="SessionValidationModule" />
    </httpModules>
  </system.web>
</location>

有什么想法吗?

【问题讨论】:

    标签: .net asp.net


    【解决方案1】:

    HttpModules 附加到 ASP.NET 请求处理管道本身。 httpModule 本身必须负责确定它想要处理哪些请求以及它想要忽略哪些请求。

    例如,这可以通过查看 context.Request.Path 属性来实现。

    【讨论】:

      【解决方案2】:

      您可以使用 HTTPHandler 代替 HTTPModule。处理程序允许您在 Web.Config 中声明它们时指定路径。

      <add verb="*" path="/validate/*.aspx" type="Handler,Assembly"/>
      

      如果您必须使用 HTTPModule,您可以只检查请求的路径,如果要排除它,则绕过验证。

      【讨论】:

      • 我正在使用相同的方法,但它不起作用。不确定这是如何被接受的答案。
      • 我尝试使用处理程序,但它似乎不适用于处理程序重新路由 http 上下文。我在这里问过:stackoverflow.com/questions/27124737/…
      【解决方案3】:

      这里是一些如何按扩展名过滤请求的简单示例...下面的示例从具有特定扩展名的处理文件中排除。按文件名过滤看起来几乎一样,只是做了一些小改动......

      public class AuthenticationModule : IHttpModule
      {
          private static readonly List<string> extensionsToSkip = AuthenticationConfig.ExtensionsToSkip.Split('|').ToList();
      
          // In the Init function, register for HttpApplication 
          // events by adding your handlers.
          public void Init(HttpApplication application)
          {
              application.BeginRequest += new EventHandler(this.Application_BeginRequest);
              application.EndRequest += new EventHandler(this.Application_EndRequest);
          }
      
          private void Application_BeginRequest(Object source, EventArgs e)
          {
              //  we don't have to process all requests...
              if (extensionsToSkip.Contains(Path.GetExtension(HttpContext.Current.Request.Url.LocalPath)))
                  return;
      
              Trace.WriteLine("Application_BeginRequest: " + HttpContext.Current.Request.Url.AbsoluteUri);
          }
      
          private void Application_EndRequest(Object source, EventArgs e)
          {
              //  we don't have to process all requests...
              if (extensionsToSkip.Contains(Path.GetExtension(HttpContext.Current.Request.Url.LocalPath)))
                  return;
      
              Trace.WriteLine("Application_BeginRequest: " + HttpContext.Current.Request.Url.AbsoluteUri);
          }
      }
      

      一般的想法是在配置文件中指定究竟应该处理什么(或从处理中排除)并在模块中使用该配置参数。

      【讨论】:

      • 老问题,但很好的答案和示例代码!我唯一的建议是使用HastSet&lt;&gt; 而不是List&lt;&gt; 进行extensionsToSkip,这应该会导致更快的查找并且没有重复。
      猜你喜欢
      • 2019-08-28
      • 2012-01-19
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多