如何解析相对路径(“~”)而不参考当前页面?

3

我正在为所有的web项目编写一个通用库。其中之一的函数是永久重定向,如下所示:

public static void PermanentRedirect(string url, HttpResponse response, bool endResponse)
{
    url = //resolve url here. how?

    response.Status = "301 Moved Permanently";
    response.AddHeader("Location", url);

    if (endResponse) response.End();
}

如何在不传递当前页面以获取访问Page.ResolveUrl的权限的情况下解析URL?请注意,我可以更改方法签名,但我希望不这样做,因为我认为它会过度负担API。

我有一些重载,所以我的期望用法是:

WebUtility.PermanentRedirect("~/somewhere/somepage.aspx")

在这种情况下,“~”是什么意思?(相对于什么?我认为双参数URI构造函数将按预期处理它。)如果无法以其他方式获得,请直接从HttpContext访问页面。 - user166390
“~”将是正常的Web应用程序根运算符,它映射到Web应用程序根目录。关于Uri构造函数,您是否指的是new Uri(string uriString, bool dontEscape)?那已经过时了,我不确定其他的是否适用。 - Jeff
3个回答

4

我相信你可以使用HttpRuntime.AppDomainAppVirtualPath直接替换波浪号。

你也可以使用VirtualPathUtility.ToAbsolute,但它不支持查询字符串——所以你必须解析它们(或者最好使用UriBuilder)。

哦——离题了,但我认为在HttpResponse上添加一个扩展方法会使语法更加简单。


扩展方法是一个不错的想法。谢谢你的提示。 - Jeff

2

+1 我刚刚才明白 OP 的意思。他只是想解析那个 URL。 - Tim Schmelter
@StriplingWarrior 是的。这就是我想做的。谢谢。 - Jeff

1

谢谢Tim。我应该表述得更清楚。我想避免完全引用页面。你觉得我强制执行这个限制是不是有点不合理?这种方式似乎有点脆弱。 - Jeff
1
@Jeff: 为什么你想获取当前页面的URL却不引用它呢?如果在非网络项目中调用它,当然它就会很脆弱。但这并不是该情况。 - Tim Schmelter
@Jeff 所以把HttpContext的东西放在一个被注入或其他方式隐藏的Facade之后…问题是:相对于什么 - user166390
@Jeff: 是有的。不过,无论如何,您应该将此功能放入注入的实用程序中。即使依赖于应用程序上下文(而不是Http上下文),也会使您的单元测试依赖外部信息,最好使用模拟进行控制。 - StriplingWarrior
@StriplingWarrior 我对依赖注入还比较新(这就是你所指的吗?),所以我需要先了解一下。你是说 VirtualPathUtiliy 存在依赖关系,会导致单元测试失败吗? - Jeff
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接