Получение Абсолютного URL-адреса для ASP.NET MVC Action
Это, вероятно, фиктивный вопрос, но я не могу найти четкое указание. У меня есть класс POCO в веб-приложении MVC3, единственной целью которого является управление резервным копированием некоторых файлов на сервере. Обычно он создает резервную копию и возвращает имя файла контроллеру, который отправляет электронное письмо с 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
Вы можете сделать это следующим образом:
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
/при вызове любого метода маршрутизации вы получаете абсолютный URL-адрес. Я рекомендую это, когда возможно, но у вас также есть более общий путь в первом примере, если он вам нужен.
Я подробно рассказывал об этом здесь:
http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/
Извлечен из Meligys AngularJS и Web Dev Goodies Newsletter
Ответ 2
Внутри контроллера:
var path = VirtualPathUtility.ToAbsolute(pathFromPoco);
var url = new Uri(Request.Url, path).AbsoluteUri
Ответ 3
Это работает для меня:
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)
Ответ 4
Встроенные помощники в MVC 4 создают абсолютные URL-адреса, если параметры host
или protocol
не являются пустыми. См. этот ответ здесь с примером метода расширения для использования в представлениях.
Ответ 5
Я написал для этого класс-помощник, для 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;
}
}
Ответ 6
У вас есть несколько вариантов:
- Сохраните значение HttpContext.Request.Url в статической или членной переменной и используйте это, чтобы передать полный путь.
- Сохраните домен приложения в настройках приложения в файле web.config.
- Жесткий код значения.