Получать абсолютный URL-адрес фрон Ан ASP.NET в MVC действий


Это, наверное, глупый вопрос, но я не могу найти четких указаний. У меня есть класс POCO в веб-приложении MVC3, единственной целью которого является управление резервным копированием некоторых файлов на сервере. Обычно он создает резервную копию и возвращает имя файла контроллеру, который отправляет электронное письмо с URL-адресом для его загрузки. Это прекрасно работает, но я не могу построить абсолютный URL для отправки. Независимо от того, какую функцию я использую, я всегда получаю относительный URL, например / Backup / TheFile.молнии, а не например http://www.somesite.com/Backup/TheFile.zip. я попробовал:

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

но все они возвращают что-то вроде / Backup / SomeFile.молнии. Есть идеи?

7 65

7 ответов:

вы можете сделать это следующим образом:

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-адрес действительно идет в ControllerAction есть более компактном виде:

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

хитрость здесь заключается в том, что как только вы укажете protocol / scheme при вызове любого метода маршрутизации вы получаете абсолютный URL. я рекомендую этот, когда это возможно, но и более общий способ в первом примере, Если вам это нужно.

Я написал об этом в блоге в деталях here:
http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/

извлеченные из Meligy это в AngularJS & веб-разработки лакомства бюллетень

внутри контроллера:

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)

встроенные помощники в MVC 4 создают абсолютные URL-адреса, Если либо host или protocol параметры непустые. Смотрите ответ здесь С примером метода расширения для использования в представлениях.

In ASP.Net Core 2.0 (MVC) это работает для создания абсолютного url-адреса действия.

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

Я написал вспомогательный класс для этого, для MVC 5... Он довольно гибкий и особенно полезен, если вам нужна эта функциональность, когда вы не находитесь внутри контроллера. Вы должны быть в состоянии бросить его прямо в проект и идти.

Как отметил Мелиги, ключ должен включать протокол. Здесь у меня он жестко закодирован как 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;
    }
}

У вас есть несколько вариантов:

  • сохраните значение HttpContext.Запрос.Url-адрес в статической переменной или переменной-члене и используйте его для передачи полного пути.
  • сохраните домен приложения в настройках приложения в интернете.конфиг.
  • жесткий код значения.