从ASP.NET MVC操作获取绝对URL

这可能是一个虚拟的问题,但我找不到一个明确的指示。 我在MVC3 Web应用程序中有一个POCO类,其唯一目的是pipe理服务器中某些文件的备份。 通常它会创build一个备份并将文件名返回给控制器,该控制器会发送一封包含用于下载的URL的电子邮件。 这工作正常,但我不能build立绝对的URL发送。 无论使用哪个函数,我都会得到一个相对URL,比如/Backup/TheFile.zip ,而不是像http://www.somesite.com/Backup/TheFile.zip 。 我试过了:

VirtualPathUtility.ToAbsolute("~/Backup/SomeFile.zip"); HttpRuntime.AppDomainAppVirtualPath + "/Backup/SomeFile.zip"; Url.Content("~/Backup/SomeFile.zip"); 

但他们都返回像/Backup/SomeFile.zip 。 任何想法?

你可以这样做:

 var urlBuilder = new System.UriBuilder(Request.Url.AbsoluteUri) { Path = Url.Action("Action", "Controller"), Query = null, }; Uri uri = urlBuilder.Uri; string url = urlBuilder.ToString(); // or urlBuilder.Uri.ToString() 

在本示例中,您可以使用Url.Content()或任何路由方法,而不是使用Url.Content() ,或者只是传递一个path。

但是,如果URL确实发送到Controller Action ,则会有一种更紧凑的方式:

 var contactUsUriString = Url.Action("Contact-Us", "About", routeValues: null /* specify if needed */, protocol: Request.Url.Scheme /* This is the trick */); 

这里的技巧是,一旦你在调用任何路由方法时指定protocol /scheme,就会得到一个绝对的URL。 我build议尽可能使用这个 ,但在第一个例子中,如果您需要的话,也可以使用更通用的方法。

我在这里详细地写了一篇文章:
http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/

从Meligy的AngularJS和Web Dev Goodies Newsletter中提取

从控制器内部:

 var path = VirtualPathUtility.ToAbsolute(pathFromPoco); var url = new Uri(Request.Url, path).AbsoluteUri 

这适用于我:

 using System; using System.Web; using System.Web.Mvc; public static class UrlExtensions { public static string Content(this UrlHelper urlHelper, string contentPath, bool toAbsolute = false) { var path = urlHelper.Content(contentPath); var url = new Uri(HttpContext.Current.Request.Url, path); return toAbsolute ? url.AbsoluteUri : path; } } 

cshtml中的用法:

 @Url.Content("~/Scripts/flot/jquery.flot.menuBar.js", true) 

如果hostprotocol参数非空,MVC 4中的内置帮助程序将创build绝对URL。 在这里看到这个答案 ,在视图中使用示例扩展方法。

我为此编写了一个辅助类,用于MVC 5 …这非常灵活,如果您不在控制器内部时需要此function,则该类非常有用。 你应该能够把它放到一个项目中去。

正如Meligy指出的那样,关键是要包括协议。 在这里,我把它硬编码为http,所以如果你想使用SSL,可能需要变得更灵活一些。

 public class AbsoluteUrlHelper { /// <summary> /// Creates an absolute "fully qualified" url from an action, and assumes the current controller. /// </summary> /// <returns></returns> public static string GetAbsoluteUrl(string action, object routeValues = null) { var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext); var values = urlHelper.RequestContext.RouteData.Values; var controller = values["controller"].ToString(); return GetAbsoluteUrl(action, controller, urlHelper, routeValues); } /// <summary> /// Creates an absolute "fully qualified" url from an action and controller. /// </summary> public static string GetAbsoluteUrl(string action, string controller, object routeValues = null) { var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext); return GetAbsoluteUrl(action, controller, urlHelper, routeValues); } /// <summary> /// Creates an absolute "fully qualified" url from an action and controller. /// </summary> public static string GetAbsoluteUrl(string action, string controller, UrlHelper urlHelper, object routeValues = null) { var uri = urlHelper.Action(action, controller, routeValues, "http"); return uri; } } 

你有几个select:

  • 将HttpContext.Request.Url的值保存在静态或成员variables中,并使用它来传递完全限定的path。
  • 将应用程序域保存在web.config中的应用程序设置中。
  • 硬编码的价值。