RC2および1.0以降、IHttpContextAccessor
拡張クラスを挿入する必要はなくなりました。IUrlHelper
を通じてすぐに利用できますurlhelper.ActionContext.HttpContext.Request
。次に、同じアイデアに従って拡張クラスを作成しますが、インジェクションが含まれないため、より簡単になります。
public static string AbsoluteAction(
this IUrlHelper url,
string actionName,
string controllerName,
object routeValues = null)
{
string scheme = url.ActionContext.HttpContext.Request.Scheme;
return url.Action(actionName, controllerName, routeValues, scheme);
}
誰かに役立つ場合に備えて、アクセサーを注入してビルドする方法の詳細を残します。また、現在のリクエストの絶対URLに関心がある場合もあります。その場合は、回答の最後を確認してください。
IHttpContextAccessor
インターフェースを使用してを取得するように拡張クラスを変更できますHttpContext
。あなたはコンテキストを持っていたら、あなたは得ることができますHttpRequest
から、インスタンスをHttpContext.Request
、そのプロパティを使用してScheme
、Host
、Protocol
などのように:
string scheme = HttpContextAccessor.HttpContext.Request.Scheme;
たとえば、クラスをHttpContextAccessorで構成するように要求できます。
public static class UrlHelperExtensions
{
private static IHttpContextAccessor HttpContextAccessor;
public static void Configure(IHttpContextAccessor httpContextAccessor)
{
HttpContextAccessor = httpContextAccessor;
}
public static string AbsoluteAction(
this IUrlHelper url,
string actionName,
string controllerName,
object routeValues = null)
{
string scheme = HttpContextAccessor.HttpContext.Request.Scheme;
return url.Action(actionName, controllerName, routeValues, scheme);
}
....
}
これは、Startup
クラス(Startup.csファイル)で実行できることです。
public void Configure(IApplicationBuilder app)
{
...
var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
UrlHelperExtensions.Configure(httpContextAccessor);
...
}
IHttpContextAccessor
拡張クラスでを取得するさまざまな方法を思い付く可能性がありますが、最終的にメソッドを拡張メソッドとして保持する場合はIHttpContextAccessor
、静的クラスにを挿入する必要があります。(それ以外の場合はIHttpContext
、各呼び出しの引数としてが必要になります)
現在のリクエストのabsoluteUriを取得するだけです
現在のリクエストの絶対URIを取得したいだけの場合は、拡張メソッドGetDisplayUrl
またはクラスGetEncodedUrl
から使用できますUriHelper
。(これはUr Lヘルパーとは異なります)
GetDisplayUrl。表示にのみ適した完全にエスケープされていない形式(QueryStringを除く)でリクエストURLの結合されたコンポーネントを返します。この形式は、HTTPヘッダーやその他のHTTP操作では使用しないでください。
GetEncodedUrl。リクエストURLの結合されたコンポーネントを、HTTPヘッダーやその他のHTTP操作での使用に適した完全にエスケープされた形式で返します。
それらを使用するには:
- 名前空間を含めます
Microsoft.AspNet.Http.Extensions
。
HttpContext
インスタンスを取得します。一部のクラス(レイザービューなど)ではすでに使用可能ですが、他のクラスでIHttpContextAccessor
は、上記で説明したようにを挿入する必要がある場合があります。
- 次に、次のように使用します
this.Context.Request.GetDisplayUrl()
これらのメソッドの代わりに、HttpContext.Request
オブジェクトの値を使用して絶対URIを手動で作成することもできます(RequireHttpsAttributeの機能と同様)。
var absoluteUri = string.Concat(
request.Scheme,
"://",
request.Host.ToUriComponent(),
request.PathBase.ToUriComponent(),
request.Path.ToUriComponent(),
request.QueryString.ToUriComponent());