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?
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?
Antworten:
Sie könnten eine VirtualPathRoot
Eigenschaft von HttpRequestContext
( request.GetRequestContext().VirtualPathRoot
) verwenden
using (WebApp.Start<Program>("http://localhost:9095/Test"))
Folgendes : Wo VirtualPathRoot zurückkehrt /Test
)
http://localhost:5550/
und es kehrt korrekt zurück /
. Was ich meinte ist, wie man http://localhost:5550/
in diesem Fall kommt ...
Request.RequestUri
) haben, können Sie die Anforderungs- Uri davon abrufen und das Schema, den Host und den Port finden ... richtig?
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
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));
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);
}
}
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
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", "")
In ASP.NET Core ist ApiController
die Request
Eigenschaft nur die Nachricht. Aber es gibt immer noch Context.Request
Orte, 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}";
}
Ich bin nicht sicher, ob es sich um eine Web-API-2-Erweiterung handelt, RequestContext
hat jedoch eine Url
Eigenschaft UrlHelper
: HttpRequestContext Properties . Es hat Link
und Content
Methoden. Details hier
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("~/");
}
}
Fügen Sie einen Verweis auf System.Web hinzu
using System.Web;
Holen Sie sich den Host oder eine andere Komponente der gewünschten URL
string host = HttpContext.Current.Request.Url.Host;
Al WebApi 2, nur HttpContext.Current.Request.Path aufrufen;
Von HttpRequestMessage
request.Headers.Host
Request.GetRequestContext().VirtualPathRoot
kehrt 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.