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


Antworten:


44

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


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


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!


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

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

}

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


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)

4

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

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


     

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", "")

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


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("~/");
    }
}

0

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


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;



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.