【问题标题】:Why RewritePath changes the Browser Url?为什么 RewritePath 会更改浏览器 URL?
【发布时间】:2011-11-28 04:58:13
【问题描述】:

我有一个 ASP.NET 4 HttpModule(参见下面的代码)。当 url 路径以“/1.0”开头时,我希望 Cassini/IIS 转到 MyService.svc。但是,我不想向用户显示“MyService.svc”(即浏览器中的 url 没有更新)。我希望用户看到“www.something.com/1.0”。

我很确定 RewriteUrl 不应该更改浏览器的 url,但在我的情况下它会。知道为什么吗?

    public void Init(HttpApplication context)
    {
        context.BeginRequest +=
            delegate
            {
                HttpContext ctx = HttpContext.Current;
                const string BasePath = "~/1.0";
                if (path.StartsWith(BasePath, StringComparison.OrdinalIgnoreCase))
                {
                    ctx.RewritePath("~/MyService.svc", "this/is/a/path", string.Empty, false);
                }
            };
    }

附:由于 URL 中的句点/点,我无法使用 ASP.NET 路由(请参阅ASP.NET MVC Route IDs with a period)。

【问题讨论】:

    标签: c# asp.net url-rewriting httpmodule cassini


    【解决方案1】:

    看起来您遇到了与此处所述相同的问题: ASP.NET RewritePath not working as expected / URL in browser changing

    在 url 中添加斜杠:

    ctx.RewritePath("~/MyService.svc/", "this/is/a/path", string.Empty, false);
    

    另外,我不确定 WCF 引擎是否会为您保留 PathInfo。可能您必须使用 URL 作为 QueryString 传递参数。

    【讨论】:

      【解决方案2】:

      您需要 ASP.NET 的 url 路由,它从 .NET 3.5 SP1 开始可用。

      对于您的情况,我认为“路由”而不是重写更容易,并且使用起来更简单。

      为什么? MSDN 是这么说的:

      在 ASP.NET 路由中,您定义包含占位符的 URL 模式 用于处理 URL 请求时使用的值。在运行时, 应用程序名称后面的 URL 片段被解析为 离散值,基于您定义的 URL 模式。为了 例如,在请求中 http://server/application/Products/show/beverages,路由解析器 可以将值 Products、show 和饮料传递给处理程序 要求。相反,在不受 URL 路由管理的请求中, /Products/show/beverages 片段将被解释为路径 应用程序中的文件。

      您还可以使用 URL 模式以编程方式创建 URL 对应路线。这使您能够集中逻辑 在 ASP.NET 应用程序中创建超链接。

      ASP.NET 路由与 URL 重写

      ASP.NET 路由不同于其他 URL 重写方案。网址 重写通过实际更改 URL 来处理传入的请求 在它将请求发送到网页之前。例如,一个 使用 URL 重写的应用程序可能会从 /Products/Widgets/ 到 /Products.aspx?id=4。另外,URL重写 通常没有用于创建基于 你的模式。在 URL 重写中,如果您更改 URL 模式,您必须 手动更新所有包含原始 URL 的超链接。

      使用 ASP.NET 路由,在传入请求时不会更改 URL 被处理,因为路由可以从 URL 中提取值。当你 必须创建一个 URL,您将参数值传递给一个方法 为您生成 URL。要更改 URL 模式,请在 一个位置,以及您在应用程序中创建的所有链接 基于该模式的将自动使用新模式。

      请参阅 MSDN 库中的 ASP.NET Routing

      【讨论】:

      • 我不能使用 ASP.NET 路由。不支持 URL 中的句点。
      • 网址中的句号是什么意思?你能详细说明一下吗?
      • Stackoverflow 中有这个有效的 URL 和 HAS 句点:stackoverflow.com/questions/tagged/asp.net
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 2017-03-30
      • 2020-07-18
      • 2010-10-15
      相关资源
      最近更新 更多