Ich weiß, dass ich Url.Link()
verwenden kann, um die URL einer bestimmten Route abzurufen, aber wie kann ich die Web-API-Basis-URL im Web-API-Controller erhalten?
Sie können die VirtualPathRoot
-Eigenschaft von HttpRequestContext
(request.GetRequestContext().VirtualPathRoot
) verwenden.
In der Aktionsmethode der Anforderung an die URL " http: // localhost: 85458/api/ctrl/ "
var baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) ;
dadurch erhalten Sie http: // localhost: 85458
Url.Content("~/")
für mich gearbeitet
Das ist was ich benutze:
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 den folgenden Ausschnitt aus der URL-Helfer-Klasse
Url.Link("DefaultApi", new { controller = "Person", id = person.Id })
Den vollständigen Artikel finden Sie hier: http://blogs.msdn.com/b/roncain/archive/2012/07/17/using-the-asp-net-web-api-urlhelper.aspx
Dies ist der offizielle Weg, für den kein Helfer oder Workaround erforderlich ist .. Wenn Sie sich diesen Ansatz anschauen, ist dies wie bei ASP.NET MVC
new Uri(Request.RequestUri, RequestContext.VirtualPathRoot)
Zuerst erhalten Sie eine vollständige URL mit HttpContext.Current.Request.Url.ToString();
, dann ersetzen Sie Ihre Methoden-URL mit Replace ("user/login", "").
Vollständiger Code wird sein
string Host = HttpContext.Current.Request.Url.ToString().Replace("user/login", "")
Nicht sicher, ob dies ein Web-API-2-Zusatz ist, aber RequestContext
hat eine Url
-Eigenschaft, die eine UrlHelper
: HttpRequestContext-Eigenschaften ist. Es hat Link
und Content
Methoden. Details hier
Basierend auf der Antwort von Athadu schreibe ich eine Erweiterungsmethode, dann können Sie in der Controller-Klasse Root-URL erhalten, indem Sie this.RootUrl();
public static class ControllerHelper
{
public static string RootUrl(this ApiController controller)
{
return controller.Url.Content("~/");
}
}
In ASP.NET Core ApiController
ist die Request
-Eigenschaft nur die Nachricht. Es gibt jedoch noch Context.Request
, wo Sie die erwarteten Informationen erhalten können. Persönlich benutze 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}";
}
senden Sie eine GET
an eine Seite und der beantwortete Inhalt wird die Antwort sein. Basis-URL: http://website/api/