Как получить базовый URL в Web API controller?


Я знаю, что могу использовать Url.Link() чтобы получить URL-адрес определенного маршрута, но как я могу получить базовый URL-адрес Web API в контроллере Web API?

13 59

13 ответов:

вы могли бы использовать 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", "")

база на ответить под прицелом, я пишу метод extenesion, потом в классе контроллера вы можете получить URL-адрес корневой папки путем this.RootUrl();

public static class ControllerHelper
{
    public static string RootUrl(this ApiController controller)
    {
        return controller.Url.Content("~/");
    }
}

отправить GET на страницу и содержание ответил будет ответ.Базовый url:http://website/api/

Al WebApi 2, просто вызов HttpContext.Текущий.Запрос.Путь;

С HttpRequestMessage

request.Headers.Host