Ответ 1
Вы можете использовать свойство VirtualPathRoot
из HttpRequestContext
(request.GetRequestContext().VirtualPathRoot
)
Я знаю, что я могу использовать Url.Link()
для получения URL определенного маршрута, но как я могу получить базовый URL веб-API в контроллере веб-API?
Вы можете использовать свойство VirtualPathRoot
из HttpRequestContext
(request.GetRequestContext().VirtualPathRoot
)
В методе действия запроса на URL "http://localhost:85458/api/ctrl/"
var baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) ;
это поможет вам http://localhost:85458
Url.Content("~/")
работал у меня!
Это то, что я использую:
Uri baseUri = new Uri(Request.RequestUri.AbsoluteUri.Replace(Request.RequestUri.PathAndQuery, String.Empty));
Затем, когда я совмещаю его с другим относительным путем, я использую следующее:
string resourceRelative = "~/images/myImage.jpg";
Uri resourceFullPath = new Uri(baseUri, VirtualPathUtility.ToAbsolute(resourceRelative));
Я ввожу эту службу в свои контроллеры.
public class LinkFactory : ILinkFactory
{
private readonly HttpRequestMessage _requestMessage;
private readonly string _virtualPathRoot;
public LinkFactory(HttpRequestMessage requestMessage)
{
_requestMessage = requestMessage;
var configuration = _requestMessage.Properties[HttpPropertyKeys.HttpConfigurationKey] as HttpConfiguration;
_virtualPathRoot = configuration.VirtualPathRoot;
if (!_virtualPathRoot.EndsWith("/"))
{
_virtualPathRoot += "/";
}
}
public Uri ResolveApplicationUri(Uri relativeUri)
{
return new Uri(new Uri(new Uri(_requestMessage.RequestUri.GetLeftPart(UriPartial.Authority)), _virtualPathRoot), relativeUri);
}
}
Используйте следующий фрагмент из класса помощника Url
Url.Link("DefaultApi", new { controller = "Person", id = person.Id })
Полная статья доступна здесь: http://blogs.msdn.com/b/roncain/archive/2012/07/17/using-the-asp-net-web-api-urlhelper.aspx
Это официальный способ, который не требует помощника или обходного пути. Если вы посмотрите на этот подход, это похоже на ASP.NET MVC
new Uri(Request.RequestUri, RequestContext.VirtualPathRoot)
Не уверен, что это дополнение Web API 2, но RequestContext
имеет свойство Url
, которое является UrlHelper
: Свойства HttpRequestContext. Он имеет методы Link
и Content
. Подробнее здесь
Сначала вы получите полный URL с помощью HttpContext.Current.Request.Url.ToString();
затем замените URL вашего метода, используя Replace ("user/login", "").
Полный код будет
string host = HttpContext.Current.Request.Url.ToString().Replace("user/login", "")
Основываясь на ответе Атаду, я пишу метод расширения, затем в классе контроллера вы можете получить корневой URL-адрес с помощью this.RootUrl();
public static class ControllerHelper
{
public static string RootUrl(this ApiController controller)
{
return controller.Url.Content("~/");
}
}
отправьте GET
на страницу, и ответ будет ответом. Базовый URL: http://website/api/
От HttpRequestMessage
request.Headers.Host
Al WebApi 2, просто вызывая HttpContext.Current.Request.Path;