在Asp.Net 4.0中部署HttpModule的问题

时间:2012-10-28 13:50:27

标签: c# asp.net .net httpmodule

我想做UrlRewriting。为了做到这一点,我编写了一个HttpModule,它运行在ASP.NET Http Modules链中的AuthorizeRequest事件上(在HttpHandler处理请求之前)。

上下文

我写了一个抽象类作为实现IHttpModule接口的基本重写器:

public abstract class BaseModuleRewriter : IHttpModule {
  public virtual void Init(HttpApplication app) {
    // WARNING! This does not work with Windows authentication!
    app.AuthorizeRequest += new ventHandler(this.BaseModuleRewriter_AuthorizeRequest);
  }
  public virtual void Dispose() { }
  protected virtual void BaseModuleRewriter_AuthorizeRequest(object sender, EventArgs e) {
    HttpApplication app = (HttpApplication)sender;
    this.Rewrite(app.Request.Path, app);
  }
  protected abstract void Rewrite(string requestedPath, HttpApplication app);
}

该模块的真正实现是以下类:

public class ModuleRewriter : BaseModuleRewriter {
  protected override void Rewrite(string requestedPath, System.Web.HttpApplication app) {
    // Just dummy, if the module works, I should never get to any page other than homepage
    UrlRewritingUtils.RewriteUrl(app.Context, "Default.aspx");
  }
}

在我的web.config中,我有以下内容:

<configuration>
  ...
  <system.web>
    <httpModules>
      <add type="ModuleRewriter" name="ModuleRewriter"/>
    </httpModules>
  </system.web>
  ...
</configuration>

实际上,这是从MSDN Megazine中发布的文章中简单实现的Url-Rewriting。我只是简单了,但方法就是那个。

问题

它不起作用!当我按照我告诉你的方式部署模块并请求页面时,我可以访问我网站的所有页面,相反,我应该始终“重定向”到Default.aspx

怎么办?

其他信息

首先,一个重要信息:我的应用程序池是集成模式目标框架4.0。

我的网站未编译。我的意思是我不预编译我的网站,但是我将所有代码放在App_Code目录中,让ASP.NET在请求页面时编译它。直接后果是我的所有程序集都放在%sysroot%\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\...目录中。

我通过指定assemply来读取一些在web.config中部署模块的东西,例如:

<configuration>
  ...
  <system.web>
    <httpModules>
      <add type="ModuleRewriter, ModuleRewriterAssembly" name="ModuleRewriter"/>
    </httpModules>
  </system.web>
  ...
</configuration>

但是,由于我的东西没有预编译,但完全由Asp.Net管理,我无法指定不同的程序集。需要解决这个问题吗?如果是这样,该怎么办?

三江源

2 个答案:

答案 0 :(得分:6)

根据您的appPool配置(集成与经典模式),尝试添加

  <system.webServer>
    <modules>
      <add type="ModuleRewriter" name="ModuleRewriter"/>
    </modules>
  </system.webServer>

答案 1 :(得分:0)

更改应用程序池解决了该问题。我将其更改为集成并且有效。