我想做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管理,我无法指定不同的程序集。需要解决这个问题吗?如果是这样,该怎么办?
三江源
答案 0 :(得分:6)
根据您的appPool配置(集成与经典模式),尝试添加
<system.webServer>
<modules>
<add type="ModuleRewriter" name="ModuleRewriter"/>
</modules>
</system.webServer>
答案 1 :(得分:0)
更改应用程序池解决了该问题。我将其更改为集成并且有效。