IIS7 HTTPModule无法重写MVC子应用程序的路径

时间:2010-11-19 20:00:18

标签: c# model-view-controller iis-7 httpmodule url-rewriting

我在IIS 7中运行了一个HTTPModule,提供了许多不同的URL重写服务。

例如:

public void Init(HttpApplication context)
{
    ...
    HttpContext.Current.RewritePath(landingPage.NewPath,
                                string.Empty,
                                landingPage.NewQueryString +
                                ((landingPage.NewQueryString == string.Empty) ? "" : "&") +
                                queryString);
    ...
}

我有一个子应用程序,其自己的应用程序池用MVC编写: http://www.SomeSiteWithURLrewrite.com/SubMVCApplication/

除了作为子应用程序创建的MVC应用程序之外,此模块运行良好。

当我发出将被重写的http请求时: http://www.SomeSiteWithURLrewrite.com/Arbitrary/Path/To/Be/Rewritten

我收到HTTP错误404.0 - 未找到

404错误页面显示已调用“http://www.SomeSiteWithURLrewrite.com/Arbitrary/Path/To/Be/Rewritten”并已重写为物理路径“C:{RootDirectory} \ SubMVCApplication \“与”StaticFile“的处理程序。

我不确定为什么pipline没有将“HttpContext.Current.RewritePath”识别为MVC请求。是因为MVC应用程序在自己的应用程序中吗?

如何调用RewritePath(或类似的东西)并让IIS在子应用程序中呈现ASP.Net MVC页面

2 个答案:

答案 0 :(得分:2)

如果跨越应用程序边界,则需要执行Response.Redirect,该响应会发出基于客户端的HTTP 301重定向命令

ReWritePath是一个仅服务器命令,需要访问路由表等。因此只有当前的应用程序边界

除了在每个Web应用程序中使用页面代理来传递内容之外,没有简单的答案,但这将是非常低效的

e.g。 server.com/a/x重写为server.com/b/x,您的代码必须检测应用程序边界更改,而是重定向将发出HTTPRequest以获取server.com/b/x内容和将该内容传回客户端?资源路径等将成为一个大问题,所以可能不是一个好主意

答案 1 :(得分:0)

我完全不同意TFD's answer。 一切都取决于你想要实现的算法。

Here您可以找到有关路由和URL重写的详细说明。 至于我为什么要实现树基URL结构,最好在路由之前使用URL重写,以

转换网址:my.site.com/page1/page2/page3/faq.aspx
致:my.site.com/content/faq.aspx?parent=page3/page2/page1

其中content是控制器名称,faq是唯一标识符。

可以从数据库或站点地图文件中获取数据。