Wie erhalte ich die Basis-URL im Web-API-Controller?

72

Ich weiß, dass ich die Url.Link()URL einer bestimmten Route abrufen kann, aber wie kann ich die Web-API-Basis-URL im Web-API-Controller abrufen?

Nikolai Samteladze
quelle

Antworten:

44

Sie könnten eine VirtualPathRootEigenschaft von HttpRequestContext( request.GetRequestContext().VirtualPathRoot) verwenden

Kiran Challa
quelle
11
Request.GetRequestContext().VirtualPathRootkehrt zurück /. Ich hoste die Web-API auf localhost im Windows-Dienst mithilfe von Owin selbst. Gibt es in diesem Fall eine Möglichkeit, die Basis-URL abzurufen? Vielen Dank.
Nikolai Samteladze
1
Hmm..dies sollte den richtigen virtuellen Pfad zurückgeben. Ich habe es jetzt selbst versucht und es funktioniert gut. Können Sie uns mitteilen, wie Sie den virtuellen Pfad festlegen (zum Beispiel gefällt mir using (WebApp.Start<Program>("http://localhost:9095/Test"))Folgendes : Wo VirtualPathRoot zurückkehrt /Test)
Kiran Challa,
3
Ok, das macht Sinn. Ich setze http://localhost:5550/und es kehrt korrekt zurück /. Was ich meinte ist, wie man http://localhost:5550/in diesem Fall kommt ...
Nikolai Samteladze
6
Ok, da Sie Zugriff auf die HttpRequestMessage ( Request.RequestUri) haben, können Sie die Anforderungs- Uri davon abrufen und das Schema, den Host und den Port finden ... richtig?
Kiran Challa
12
neue Uri (Request.RequestUri, RequestContext.VirtualPathRoot)
MoonStom
86

In der Aktionsmethode der Anfrage an die URL " http: // localhost: 85458 / api / ctrl / "

var baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) ;

Dadurch erhalten Sie http: // localhost: 85458

mLar
quelle
6
Dies ist falsch. Es funktioniert nur, wenn Sie Ihre Site als Stammwebsite in IIS ausführen. Wenn Sie Ihre Anwendung in einer anderen Anwendung ausführen , z. B. localhost: 85458 / Subfolder / api / ctrl, würde dies die falsche Antwort ergeben (es würde nicht "/ Subfolder" enthalten, was es sollte).
Schiedsrichter
43
Url.Content("~/")

hat für mich gearbeitet!

Athadu
quelle
Ich kam hierher für diese Antwort :)
Marek
1
Funktioniert auf .Net Core 2.2
MiBol
16

Das benutze ich:

Uri baseUri = new Uri(Request.RequestUri.AbsoluteUri.Replace(Request.RequestUri.PathAndQuery, String.Empty));

Wenn ich es dann mit einem anderen relativen Pfad kombiniere , verwende ich Folgendes:

string resourceRelative = "~/images/myImage.jpg";
Uri resourceFullPath = new Uri(baseUri, VirtualPathUtility.ToAbsolute(resourceRelative));
David Martin
quelle
10

Ich injiziere diesen Dienst in meine Controller.

 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);
    }

}
Darrel Miller
quelle
Und wie injiziert man HttpRequestMessage?
Richard Szalay
1
@RichardSzalay Autofac hat es eingebaut, github.com/autofac/Autofac/blob/master/Core/Source/…, aber die allgemeine Idee ist, dass Sie einen DI-Container einrichten und dann einen Nachrichtenhandler verwenden, um die HttpRequestMessage abzurufen und in einer zu registrieren Handler pro Anfrage.
Darrel Miller
7

Verwenden Sie das folgende Snippet aus der URL-Hilfsklasse

Url.Link("DefaultApi", new { controller = "Person", id = person.Id })

Der vollständige Artikel ist hier verfügbar: http://blogs.msdn.com/b/roncain/archive/2012/07/17/using-the-asp-net-web-api-urlhelper.aspx

Dies ist der offizielle Weg, der keine Hilfe oder Problemumgehung erfordert. Wenn Sie sich diesen Ansatz ansehen, ist er wie ASP.NET MVC

Raffaeu
quelle
Wenn Sie eine benutzerdefinierte Domäne in Azure verwenden, gibt Url.Link die .websites-Domäne anstelle der benutzerdefinierten Domäne zurück. Warum ist das so?
JobaDiniz
4
new Uri(Request.RequestUri, RequestContext.VirtualPathRoot)
MoonStom
quelle
4

In .NET Core WebAPI (Version 3.0 und höher):

var requestUrl = $"{Request.Scheme}://{Request.Host.Value}/";


     
Gokulnath
quelle
2

Zuerst erhalten Sie die vollständige URL mit HttpContext.Current.Request.Url.ToString();und ersetzen dann Ihre Methoden-URL mit Ersetzen ("Benutzer / Login", "").

Vollständiger Code wird sein

string host = HttpContext.Current.Request.Url.ToString().Replace("user/login", "")
Shafiq Rabbi
quelle
2

In ASP.NET Core ist ApiControllerdie RequestEigenschaft nur die Nachricht. Aber es gibt immer noch Context.RequestOrte, an denen Sie erwartete Informationen erhalten können. Persönlich verwende ich diese Erweiterungsmethode:

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}";
}
Jan Zahradník
quelle
1

Ich bin nicht sicher, ob es sich um eine Web-API-2-Erweiterung handelt, RequestContexthat jedoch eine UrlEigenschaft UrlHelper: HttpRequestContext Properties . Es hat Linkund ContentMethoden. Details hier

Mrchief
quelle
1

Basierend auf Athadus Antwort schreibe ich eine Erweiterungsmethode, dann können Sie in der Controller-Klasse die Root-URL von erhalten this.RootUrl();

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

Senden Sie eine GETan eine Seite und der beantwortete Inhalt ist die Antwort. Basis-URL:http://website/api/

zeo
quelle
0
  1. Fügen Sie einen Verweis auf System.Web hinzu using System.Web;

  2. Holen Sie sich den Host oder eine andere Komponente der gewünschten URL string host = HttpContext.Current.Request.Url.Host;

Alon Schachter
quelle
-1

Al WebApi 2, nur HttpContext.Current.Request.Path aufrufen;

Fernando Torres
quelle
-1

Von HttpRequestMessage

request.Headers.Host
Balla Győző
quelle