Древний вопрос, но я думал, что отвечу на него, так как многие из ответов неполные.
public static string ResolveFullUrl(this System.Web.UI.Page page, string relativeUrl)
{
if (string.IsNullOrEmpty(relativeUrl))
return relativeUrl;
if (relativeUrl.StartsWith("/"))
relativeUrl = relativeUrl.Insert(0, "~");
if (!relativeUrl.StartsWith("~/"))
relativeUrl = relativeUrl.Insert(0, "~/");
return $"{page.Request.Url.Scheme}{Uri.SchemeDelimiter}{page.Request.Url.Authority}{VirtualPathUtility.ToAbsolute(relativeUrl)}";
}
Это работает как расширение off Page, точно так же, как ResolveUrl и ResolveClientUrl для веб-форм. Не стесняйтесь конвертировать его в расширение HttpResponse, если вы хотите или должны использовать его в среде без веб-форм. Он корректно обрабатывает как http, так и https, на стандартных и нестандартных портах, а также при наличии компонента имени пользователя / пароля. Также не используются жестко закодированные строки (а именно: //).