Url.Link()
を使用して特定のルートのURLを取得できることは知っていますが、Web APIコントローラーでWeb APIベースURLを取得するにはどうすればよいですか?
VirtualPathRoot
のHttpRequestContext
プロパティを使用できます(request.GetRequestContext().VirtualPathRoot
)
URLへのリクエストのアクションメソッドで " http:// localhost:85458/api/ctrl / "
var baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) ;
これはあなたを取得します http:// localhost:85458
Url.Content("~/")
私のために働いた!
これは私が使用するものです:
Uri baseUri = new Uri(Request.RequestUri.AbsoluteUri.Replace(Request.RequestUri.PathAndQuery, String.Empty));
次に、別の相対パスと組み合わせた場合、次を使用します。
string resourceRelative = "~/images/myImage.jpg";
Uri resourceFullPath = new Uri(baseUri, VirtualPathUtility.ToAbsolute(resourceRelative));
このサービスをコントローラーに注入します。
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);
}
}
Urlヘルパークラスから次のスニペットを使用します
Url.Link("DefaultApi", new { controller = "Person", id = person.Id })
完全な記事はこちらから入手できます。 http://blogs.msdn.com/b/roncain/archive/2012/07/17/using-the-asp-net-web-api-urlhelper.aspx =
これは、ヘルパーや回避策を必要としない公式の方法です。このアプローチを見ると、ASP.NET MVCのようなものです
new Uri(Request.RequestUri, RequestContext.VirtualPathRoot)
最初にHttpContext.Current.Request.Url.ToString();
を使用して完全なURLを取得し、Replace( "user/login"、 "")を使用してメソッドのURLを置き換えます。
完全なコードは
string Host = HttpContext.Current.Request.Url.ToString().Replace("user/login", "")
これがWeb API 2の追加かどうかはわかりませんが、RequestContext
にはUrl
であるUrlHelper
プロパティがあります: HttpRequestContext Properties 。 Link
およびContent
メソッドがあります。詳細 ここ
Athaduの答えに基づいて、拡張メソッドを作成し、コントローラクラスでthis.RootUrl();
によってルートURLを取得できます
public static class ControllerHelper
{
public static string RootUrl(this ApiController controller)
{
return controller.Url.Content("~/");
}
}
ASP.NET Core ApiController
では、Request
プロパティはメッセージのみです。ただし、期待される情報を取得できるContext.Request
はまだあります。個人的に私はこの拡張方法を使用します:
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}";
}
GET
をページに送信すると、返信されたコンテンツがanswer.Base url:http://website/api/
になります