I know that I can use Url.Link()
to get URL of a specific route, but how can I get Web API base URL in Web API controller?
You could use VirtualPathRoot
property from HttpRequestContext
(request.GetRequestContext().VirtualPathRoot
)
In the action method of the request to the url "http://localhost:85458/api/ctrl/"
var baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) ;
this will get you http://localhost:85458
Url.Content("~/")
worked for me!
This is what I use:
Uri baseUri = new Uri(Request.RequestUri.AbsoluteUri.Replace(Request.RequestUri.PathAndQuery, String.Empty));
Then when I combine it with another relative path, I use the following:
string resourceRelative = "~/images/myImage.jpg";
Uri resourceFullPath = new Uri(baseUri, VirtualPathUtility.ToAbsolute(resourceRelative));
I inject this service into my controllers.
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);
}
}
Use the following snippet from the Url helper class
Url.Link("DefaultApi", new { controller = "Person", id = person.Id })
The full article is available here: http://blogs.msdn.com/b/roncain/archive/2012/07/17/using-the-asp-net-web-api-urlhelper.aspx
This is the official way which does not require any helper or workaround. If you look at this approach is like ASP.NET MVC
new Uri(Request.RequestUri, RequestContext.VirtualPathRoot)
First you get full URL using
HttpContext.Current.Request.Url.ToString();
then replace your method url using Replace("user/login", "").
Full code will be
string host = HttpContext.Current.Request.Url.ToString().Replace("user/login", "")
Not sure if this is a Web API 2 addition, but RequestContext
has a Url
property which is a UrlHelper
: HttpRequestContext Properties. It has Link
and Content
methods. Details here
Base on Athadu's answer, I write an extenesion method, then in the Controller Class you can get root url by this.RootUrl();
public static class ControllerHelper
{
public static string RootUrl(this ApiController controller)
{
return controller.Url.Content("~/");
}
}
send a GET
to a page and the content replied will be the answer.Base url : http://website/api/
In ASP.NET Core ApiController
the Request
property is only the message. But there is still Context.Request
where you can get expected info. Personally I use this extension method:
public static string GetBaseUrl(this HttpRequest request)
{
// SSL offloading
var scheme = request.Host.Host.Contains("localhost") ? request.Scheme : "https";
return $"{scheme}://{request.Host}{request.PathBase}";
}
Al WebApi 2, just calling HttpContext.Current.Request.Path;
From HttpRequestMessage
request.Headers.Host
来源:https://stackoverflow.com/questions/19866192/how-to-get-base-url-in-web-api-controller