У меня есть следующий вспомогательный метод:
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-адреса с запросами?
Изменение: я должен добавить, что помощник отлично справляется с другими URL-адресами, связанными с приложениями, если на них нет ни одного запроса.
Edit2: я сделал обходное решение, удалив запрос из URL-адреса, прежде чем вызывать методы VirtualPathUtility, а затем приклеивать его обратно в конце. Я бы предпочел избежать этого, если это возможно.
Если вы используете.NET 3.5 и ниже, то вы правы, VirtualPathUtility
не примет строку запроса как действительную часть виртуального пути для этих методов. Вам придется обрезать строку запроса и повторно добавить ее на ваш абсолютный URL. Проверьте этот отличный вопрос/ответ. Почему я получаю HttpException из VirtualPathUtility ToAbsolute с некоторыми путями? ,
http://example.com/~....
?VirtualPathUtility.IsAppRelative
заключается в том, чтобы определить, является ли URL-адрес относительным к приложению путем, т.е. начинается с~/
.