如何将相对url转换为完整url?

举例来说,这可能更容易解释。 我试图find一个相对的URL,例如“/Foo.aspx”或“〜/ Foo.aspx”到一个完整的URL,例如http://localhost/Foo.aspx 。 这样,当我部署testing或阶段,其中网站运行的域名是不同的,我会得到http://test/Foo.aspx和http://stage/Foo.aspx 。

有任何想法吗?

玩这个( 从这里修改)

public string ConvertRelativeUrlToAbsoluteUrl(string relativeUrl) { return string.Format("http{0}://{1}{2}", (Request.IsSecureConnection) ? "s" : "", Request.Url.Host, Page.ResolveUrl(relativeUrl) ); } 

这个被打死了,但我想我会张贴我自己的解决scheme,我认为比其他许多答案更清洁。

 public static string AbsoluteAction(this UrlHelper url, string actionName, string controllerName, object routeValues) { return url.Action(actionName, controllerName, routeValues, url.RequestContext.HttpContext.Request.Url.Scheme); } public static string AbsoluteContent(this UrlHelper url, string path) { Uri uri = new Uri(path, UriKind.RelativeOrAbsolute); //If the URI is not already absolute, rebuild it based on the current request. if (!uri.IsAbsoluteUri) { Uri requestUrl = url.RequestContext.HttpContext.Request.Url; UriBuilder builder = new UriBuilder(requestUrl.Scheme, requestUrl.Host, requestUrl.Port); builder.Path = VirtualPathUtility.ToAbsolute(path); uri = builder.Uri; } return uri.ToString(); } 

你只需要使用page.request.url创build一个新的URI,然后得到AbsoluteUri

 New System.Uri(Page.Request.Url, "Foo.aspx").AbsoluteUri 

这是我的帮手function来做到这一点

 public string GetFullUrl(string relativeUrl) { string root = Request.Url.GetLeftPart(UriPartial.Authority); return root + Page.ResolveUrl("~/" + relativeUrl) ; } 

我以为我会分享我的方法来做到这一点在ASP.NET MVC中使用Uri类和一些扩展魔术。

 public static class UrlHelperExtensions { public static string AbsolutePath(this UrlHelper urlHelper, string relativePath) { return new Uri(urlHelper.RequestContext.HttpContext.Request.Url, relativePath).ToString(); } } 

然后你可以输出一个绝对path使用:

 // gives absolute path, eg https://example.com/customers Url.AbsolutePath(Url.Action("Index", "Customers")); 

它看起来有一个丑陋的嵌套的方法调用,所以我更愿意进一步扩展UrlHelper常用的操作方法,以便我可以做到:

 // gives absolute path, eg https://example.com/customers Url.AbsoluteAction("Index", "Customers"); 

要么

 Url.AbsoluteAction("Details", "Customers", new{id = 123}); 

完整的扩展类如下:

 public static class UrlHelperExtensions { public static string AbsolutePath(this UrlHelper urlHelper, string relativePath) { return new Uri(urlHelper.RequestContext.HttpContext.Request.Url, relativePath).ToString(); } public static string AbsoluteAction(this UrlHelper urlHelper, string actionName, string controllerName) { return AbsolutePath(urlHelper, urlHelper.Action(actionName, controllerName)); } public static string AbsoluteAction(this UrlHelper urlHelper, string actionName, string controllerName, object routeValues) { return AbsolutePath(urlHelper, urlHelper.Action(actionName, controllerName, routeValues)); } } 

使用.NET Uri类来组合您的相对path和主机名。
http://msdn.microsoft.com/en-us/library/system.uri.aspx

这是我为转换创build的帮助函数。

 //"~/SomeFolder/SomePage.aspx" public static string GetFullURL(string relativePath) { string sRelative=Page.ResolveUrl(relativePath); string sAbsolute=Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery,sRelative); return sAbsolute; } 

只是:

 url = new Uri(baseUri, url); 

在ASP.NET MVC中,您可以使用HtmlHelperUrlHelper的重载protocolhost参数。 当这些参数中的任何一个非空时,助手将生成绝对URL。 这是我正在使用的扩展方法:

 public static MvcHtmlString ActionLinkAbsolute<TViewModel>( this HtmlHelper<TViewModel> html, string linkText, string actionName, string controllerName, object routeValues = null, object htmlAttributes = null) { var request = html.ViewContext.HttpContext.Request; var url = new UriBuilder(request.Url); return html.ActionLink(linkText, actionName, controllerName, url.Scheme, url.Host, null, routeValues, htmlAttributes); } 

并从剃刀视图使用它,例如:

  @Html.ActionLinkAbsolute("Click here", "Action", "Controller", new { id = Model.Id }) 

古代的问题,但我想我会回答,因为许多答案是不完整的。

 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)}"; } 

这就像关于Page的扩展一样,就像ResolveUrl和ResolveClientUrl for webforms一样。 如果您想要或需要在非webforms环境中使用它,请随意将其转换为HttpResponse扩展。 它可以在标准和非标准端口上正确处理http和https,以及是否有用户名/密码组件。 它也不使用任何硬编码的string(即://)。

这是一个方法。 这不关心string是相对的还是绝对的,但是你必须提供一个baseUri来使用它。

  /// <summary> /// This function turns arbitrary strings containing a /// URI into an appropriate absolute URI. /// </summary> /// <param name="input">A relative or absolute URI (as a string)</param> /// <param name="baseUri">The base URI to use if the input parameter is relative.</param> /// <returns>An absolute URI</returns> public static Uri MakeFullUri(string input, Uri baseUri) { var tmp = new Uri(input, UriKind.RelativeOrAbsolute); //if it's absolute, return that if (tmp.IsAbsoluteUri) { return tmp; } // build relative on top of the base one instead return new Uri(baseUri, tmp); } 

在ASP.NET的上下文中,你可以这样做:

 Uri baseUri = new Uri("http://yahoo.com/folder"); Uri newUri = MakeFullUri("/some/path?abcd=123", baseUri); // //newUri will contain http://yahoo.com/some/path?abcd=123 // Uri newUri2 = MakeFullUri("some/path?abcd=123", baseUri); // //newUri2 will contain http://yahoo.com/folder/some/path?abcd=123 // Uri newUri3 = MakeFullUri("http://google.com", baseUri); // //newUri3 will contain http://google.com, and baseUri is not used at all. // 

从其他答案修改本地和其他端口的工作…即时通讯使用前。 邮件链接。 你可以调用任何部分的应用程序,不仅在一个页面或usercontrol,我把这个在全球不需要传递HttpContext.Current.Request作为参数

  /// <summary> /// Return full URL from virtual relative path like ~/dir/subir/file.html /// usefull in ex. external links /// </summary> /// <param name="rootVirtualPath"></param> /// <returns></returns> public static string GetAbsoluteFullURLFromRootVirtualPath(string rootVirtualPath) { return string.Format("http{0}://{1}{2}{3}", (HttpContext.Current.Request.IsSecureConnection) ? "s" : "" , HttpContext.Current.Request.Url.Host , (HttpContext.Current.Request.Url.IsDefaultPort) ? "" : ":" + HttpContext.Current.Request.Url.Port , VirtualPathUtility.ToAbsolute(rootVirtualPath) ); }