2

我想做UrlRewriting。为了做到这一点,我编写了一个 HttpModule,它在AuthorizeRequestASP.NET Http Modules 链中的事件上运行(在 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\...目录中。

我通过指定组件也阅读了一些在 web.config 中部署模块的内容,例如:

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

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

谢谢

4

2 回答 2

7

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

  <system.webServer>
    <modules>
      <add type="ModuleRewriter" name="ModuleRewriter"/>
    </modules>
  </system.webServer>
于 2012-10-28T18:43:04.070 回答
0

更改应用程序池解决了该问题。我将其更改为集成,并且可以正常工作。

于 2016-09-12T10:31:56.830 回答