我有一个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)。
答案 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。