让我说明我对ASP.Net MVC并不熟悉的蝙蝠,我认为我没有时间让这个项目熟悉并转换。
我正在建立一个只有一个物理页面的网站mysite.com/default.aspx。如果用户浏览mysite.com/foo/bar,我(不知何故)希望我的default.aspx处理该请求。我知道它听起来非常“路由”/“控制器”...但是有没有办法在不将整个hog切换到MVC的情况下做到这一点?
另外值得注意的是,该网站还将提供静态图像以及我不希望由我的页面提供的内容...因此生成的mysite.com/foo/bar的html可能包含一个包含img的html用mysc.com/images/foo.gif的src标记,所以我需要能够排除某些文件夹/文件/诸如此类的处理。
答案 0 :(得分:4)
您所谈论的内容称为URL重写,是的,ASP.Net表单应用程序能够实现。这个条目似乎在这里很好地解释了这个技术:
http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx
要允许HTTP重写处理IIS 6中不存在的文件,您需要实现通配符映射。 ASP.Net MVC成为同一问题的牺牲品,所以即使你没有使用ASP.Net MVC,这篇文章仍然是相关的:
http://haacked.com/archive/2008/11/26/asp.net-mvc-on-iis-6-walkthrough.aspx
向下滚动到标题:“ IIS6无扩展名网址”
如果您需要弄清楚如何进入IIS属性窗口,请向上滚动一些上下文。只需忽略关于.mvc扩展名的部分。
答案 1 :(得分:0)
您可以设置IIS以将所有404请求重定向到您的网站。如果我没记错的话,IIS 6中有一个错误(如果这就是你正在运行的那个)将返回200状态代码,允许你进行正常处理。
否则,您可以使用web.config中的标记来处理重定向 - 但是,我认为这可能会返回404错误代码。
希望有所帮助!
答案 2 :(得分:0)
我认为我在IIS7中有一些工作......但它似乎有些脆弱:
我有一个HttpModule,设置如下:
<modules runAllManagedModulesForAllRequests="true">
<remove name="ScriptModule" />
<add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="MyRewriteModule" preCondition="managedHandler" type="MyWeb.MyRewriteModule, MyWeb" />
</modules>
我的模块的代码如下:
void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
HttpRequest request = app.Context.Request;
List<string> ignoreExtensions = new List<string>() { "axd", "gif", "ico" };
if(ignoreExtensions.TrueForAll(s => !request.FilePath.ToLower().EndsWith(s)))
app.Context.RewritePath("~/default.aspx", request.Path, request.QueryString.ToString(), true);
}
显然我会缓存并扩展该列表......但总的来说它似乎有效。任何人都可以指出任何明显的缺点吗?
答案 3 :(得分:0)
只需修改404错误页面即可重定向到default.aspx。