How to get base URL in Web API controller?

Urlasp.net Web-ApiBase Urlasp.net Web-Api2

Url 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

  1. Add a reference to System.Web using System.Web;

  2. 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;

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNikolai SamteladzeView Question on Stackoverflow
Solution 1 - UrlmLarView Answer on Stackoverflow
Solution 2 - UrlAthaduView Answer on Stackoverflow
Solution 3 - UrlKiranView Answer on Stackoverflow
Solution 4 - UrlDavid MartinView Answer on Stackoverflow
Solution 5 - UrlGokulnathView Answer on Stackoverflow
Solution 6 - UrlDarrel MillerView Answer on Stackoverflow
Solution 7 - UrlRaffaeuView Answer on Stackoverflow
Solution 8 - UrlMoonStomView Answer on Stackoverflow
Solution 9 - UrlJan ZahradníkView Answer on Stackoverflow
Solution 10 - UrlMrchiefView Answer on Stackoverflow
Solution 11 - UrlShafiq RabbiView Answer on Stackoverflow
Solution 12 - Urlyu yang JianView Answer on Stackoverflow
Solution 13 - UrlzeoView Answer on Stackoverflow
Solution 14 - UrlAlon SchachterView Answer on Stackoverflow
Solution 15 - UrlBalla GyőzőView Answer on Stackoverflow
Solution 16 - UrlFernando TorresView Answer on Stackoverflow