为什么RewritePath会更改浏览器URL?

时间:2011-09-30 05:24:45

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

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

我很确定RewriteUrl不应该更改浏览器网址,但在我的情况下确实如此。知道为什么吗?

    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);
                }
            };
    }

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

2 个答案:

答案 0 :(得分:1)

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

将尾部斜杠添加到网址:

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

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

答案 1 :(得分:0)

您需要ASP.NET的URL路由,并且自.NET 3.5 SP1起可用。

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

为什么呢? MSDN说:

  

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

     

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

     

ASP.NET路由与URL重写

     

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

     

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

请参阅MSDN Library中的ASP.NET Routing