How to get base URL in Web API controller?
Urlasp.net Web-ApiBase Urlasp.net Web-Api2Url Problem Overview
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?
Url Solutions
Solution 1 - Url
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
Solution 2 - Url
Url.Content("~/")
worked for me!
Solution 3 - Url
You could use VirtualPathRoot
property from HttpRequestContext
(request.GetRequestContext().VirtualPathRoot
)
Solution 4 - Url
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));
Solution 5 - Url
In .NET Core WebAPI (version 3.0 and above):
var requestUrl = $"{Request.Scheme}://{Request.Host.Value}/";
Solution 6 - Url
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);
}
}
Solution 7 - Url
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
Solution 8 - Url
new Uri(Request.RequestUri, RequestContext.VirtualPathRoot)
Solution 9 - Url
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}";
}
Solution 10 - Url
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
Solution 11 - Url
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", "")
Solution 12 - Url
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("~/");
}
}
Solution 13 - Url
send a GET
to a page and the content replied will be the answer.Base url : http://website/api/
Solution 14 - Url
-
Add a reference to System.Web
using System.Web;
-
Get the host or any other component of the url you want
string host = HttpContext.Current.Request.Url.Host;
Solution 15 - Url
From HttpRequestMessage
request.Headers.Host
Solution 16 - Url
Al WebApi 2, just calling HttpContext.Current.Request.Path;