Je sais que je peux utiliser Url.Link()
pour obtenir l'URL d'une route spécifique, mais comment puis-je obtenir l'URL de base de l'API Web dans le contrôleur API Web?
Vous pouvez utiliser la propriété VirtualPathRoot
de HttpRequestContext
(request.GetRequestContext().VirtualPathRoot
)
Dans la méthode d'action de la demande à l'URL " http: // localhost: 85458/api/ctrl/ "
var baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) ;
cela vous donnera http: // localhost: 85458
Url.Content("~/")
travaillé pour moi!
C'est ce que j'utilise:
Uri baseUri = new Uri(Request.RequestUri.AbsoluteUri.Replace(Request.RequestUri.PathAndQuery, String.Empty));
Ensuite, lorsque je le combine avec un autre chemin relatif , j’utilise ce qui suit:
string resourceRelative = "~/images/myImage.jpg";
Uri resourceFullPath = new Uri(baseUri, VirtualPathUtility.ToAbsolute(resourceRelative));
J'injecte ce service dans mes contrôleurs.
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);
}
}
Utilisez l'extrait suivant de la classe d'assistance Url
Url.Link("DefaultApi", new { controller = "Person", id = person.Id })
L'article complet est disponible ici: http://blogs.msdn.com/b/roncain/archive/2012/07/17/using-the-asp-net-web-api-urlhelper.aspx
C’est la méthode officielle qui ne nécessite aucune aide ou solution de contournement . Si vous regardez cette approche, c’est comme ASP.NET MVC
new Uri(Request.RequestUri, RequestContext.VirtualPathRoot)
D'abord, vous obtenez l'URL complète en utilisant HttpContext.Current.Request.Url.ToString();
, puis remplacez l'URL de votre méthode en utilisant Replace ("utilisateur/identifiant", "").
Le code complet sera
string Host = HttpContext.Current.Request.Url.ToString().Replace("user/login", "")
Vous ne savez pas s'il s'agit d'un ajout de Web API 2, mais RequestContext
a une propriété Url
qui est une UrlHelper
: HttpRequestContext Properties . Il a Link
et Content
méthodes. Détails ici
Sur la base de Athadu answer, j’écris une méthode d’extension, puis dans la classe de contrôle, vous pouvez obtenir l’URL racine par this.RootUrl();
.
public static class ControllerHelper
{
public static string RootUrl(this ApiController controller)
{
return controller.Url.Content("~/");
}
}
Dans ASP.NET Core ApiController
, la propriété Request
correspond uniquement au message. Mais il y a toujours Context.Request
où vous pouvez obtenir les informations attendues. Personnellement j'utilise cette méthode d'extension:
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}";
}
envoyez une GET
à une page et le contenu de la réponse sera la réponse. URL de la base: http://website/api/