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


77

这可能是一个虚拟的问题,但我找不到明确的指示。我在MVC3 Web应用程序中有一个POCO类,其唯一目的是管理服务器中某些文件的备份。通常,它会创建一个备份并将文件名返回给控制器,该控制器会发送一封包含URL的电子邮件以进行下载。这可以正常工作,但是我无法建立要发送的绝对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之类的内容。任何的想法?


1
在类似的情况下,这里的答案对我有帮助。此答案同时解决了http / https和端口号。这非常有用,因为我的本地开发在带有端口号的http上,而生产解决方案在https上。
Sujeewa 2014年

Answers:


117

您可以执行以下操作:

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.Action()在本示例中,您还可以使用Url.Content(),或任何路由方法,或者实际上只是传递路径。

但是,如果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。我在可能的情况下建议使用此方法,但在第一个示例中,如果需要的话,您也可以使用更通用的方法。

我在这里详细介绍了它的博客:http :
//gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/

摘自Meligy的AngularJS和Web Dev Goodies通讯


编辑:如果您的请求Uri具有查询段,则可能还需要覆盖Uri构建器上的Query属性!
Tim Lovell-Smith

这是包含所有选项的快速摘要帖子:benjii.me/2015/05/…–
Ben Cull

35

从控制器内部:

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

1
VirtualPathUtility仍然返回相对URI在MVC4控制器
马克西姆六。

6
再加上Uri类,这就是您所需要的。毫无意义的评论。
克里斯,

我首先要通过Url.Content()方法传递您的路径。对于非绝对路径(以“ /”开头)的路径,此答案将失败。
尼尔·梦露

19

这对我有用:

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)

这很棒。实际上,我实际上写了您在答案中所建议的内容,但没有想到将其添加为对Content方法的替代以使其更加精简。谢谢!
尼尔·梦露

非常感谢您提供的出色解决方案。我正在使用ng-include指令,由于相对路径,我遇到了很多问题。我在您的代码中添加的唯一内容是“”。
FrenkyB '16

4

如果hostprotocol参数为非空值,则MVC 4中的内置帮助器将创建绝对URL 。请参阅此处的答案以及在视图中使用的示例扩展方法。


1

在ASP.Net Core 2.0(MVC)中,这可以创建动作的绝对URL。

var url = Url.Action("About", "Home", new { /*Route values here*/ }, Request.Scheme);

0

我为此编写了一个针对MVC 5的帮助程序类。它非常灵活,如果您不在控制器内部时需要此功能,则它特别有用。您应该能够将其直接放入项目并继续。

正如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;
    }
}

-5

您有几种选择:

  • 将HttpContext.Request.Url的值保存在静态或成员变量中,并使用该值传递完全限定的路径。
  • 将应用程序域保存在web.config中的应用程序设置中。
  • 硬编码值。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.