强制所有asp.net请求到一个页面?

时间:2009-06-26 21:15:55

标签: asp.net

让我说明我对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标记,所以我需要能够排除某些文件夹/文件/诸如此类的处理。

4 个答案:

答案 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。