【问题标题】:IIS7 HTTPModule not able to rewrite path to a MVC sub applicationIIS7 HTTPModule 无法重写 MVC 子应用程序的路径
【发布时间】:2011-05-12 20:22:06
【问题描述】:

我有一个在 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" 的处理程序。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      我完全不同意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 是唯一标识符。

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

      【讨论】:

        猜你喜欢
        • 2011-05-10
        • 2011-01-10
        • 2011-03-25
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 2016-02-22
        • 2011-03-04
        • 1970-01-01
        相关资源
        最近更新 更多