我有以下帮助方法:
public static String ResolveUrl(String url)
{
url = url.Trim();
if (!(url[0] == '~')) return url;
try
{
if (VirtualPathUtility.IsAppRelative(url)) return VirtualPathUtility.ToAbsolute(url);
return url;
}
catch (HttpException)
{
return url;
}
}
问题是如果提供的URL包含查询字符串,它会引发异常,例如。 ~/showcase/View.aspx?id=10783
。
堆栈追踪:
System.Web.HttpException was caught
Message='~/showcase/View.aspx?id=10783' is not a valid virtual path.
Source=System.Web
ErrorCode=-2147467259
StackTrace:
at System.Web.VirtualPath.Create(String virtualPath, VirtualPathOptions options)
at System.Web.VirtualPathUtility.IsAppRelative(String virtualPath)
at Ctf.Common.ResolveUrl(String url) in [redacted]Common.cs:line 359
InnerException:
这里有什么问题? VirtualPathUtility
是否仅支持查询字符串网址?
编辑:我应该补充一点,只要没有查询字符串,帮助程序与其他应用程序相对URL完全没问题。
Edit2:我通过在调用VirtualPathUtility方法之前从URL中删除查询字符串,然后在最后粘贴它来制作黑客解决方法。如果可能的话,我宁愿避免这种情况。
答案 0 :(得分:1)
如果您使用的是.NET 3.5及更低版本,那么您是对的,VirtualPathUtility
将不接受查询字符串作为这些方法的虚拟路径的有效部分。您必须修剪查询字符串并将其重新附加到绝对URL上。看看这个优秀的问题/答案Why do I get an HttpException from VirtualPathUtility ToAbsolute with some paths?。