我想做UrlRewriting。为了做到这一点,我编写了一个 HttpModule,它在AuthorizeRequest
ASP.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 管理,我无法指定不同的程序集。是否需要解决这个问题?如果是这样,该怎么办?
谢谢