HttpRequest
Asp.Net 5(vNext)内のクラスは、以下のような要求のためのURLについて解析された内容、(とりわけ)が含まれScheme
、Host
、Path
など
ただし、元のリクエストURLを公開している場所はまだ見つかりませんでした。これらの解析された値のみです。(以前のバージョンにはありましたRequest.Uri
)
HttpRequestで利用可能なコンポーネントからURLをつなぎ合わせる必要なしに、生のURLを取り戻すことはできますか?
HttpRequest
Asp.Net 5(vNext)内のクラスは、以下のような要求のためのURLについて解析された内容、(とりわけ)が含まれScheme
、Host
、Path
など
ただし、元のリクエストURLを公開している場所はまだ見つかりませんでした。これらの解析された値のみです。(以前のバージョンにはありましたRequest.Uri
)
HttpRequestで利用可能なコンポーネントからURLをつなぎ合わせる必要なしに、生のURLを取り戻すことはできますか?
回答:
直接アクセスできないようですが、フレームワークを使用してビルドできます。
Microsoft.AspNetCore.Http.Extensions.UriHelper.GetFullUrl(Request)
上記を拡張メソッドとして使用することもできます。
これはではstring
なくを返しますUri
が、目的を果たすはずです!(これもの役割を果たしているようUriBuilder
です。)
@mswietlickiが欠落しているのではなく、リファクタリングされたばかりであることを指摘してくれてありがとう!また、@ CFに、私の答えの名前空間の変更を指摘してください!
GetEncodedUri
またはのいずれかを呼び出すだけGetDisplayUri
です。
Nugetパッケージを追加します/使用:
using Microsoft.AspNetCore.Http.Extensions;
(ASP.NET Core RC1では、これはMicrosoft.AspNet.Http.Extensionsにありました)
次に、以下を実行して完全なhttpリクエストURLを取得できます。
var url = httpContext.Request.GetEncodedUrl();
または
var url = httpContext.Request.GetDisplayUrl();
目的に応じて。
using
これらは「通常の」メソッドではなく、拡張メソッドであるため、回答に記載されているように、ファイルにディレクティブがあることを確認してください。
実際の生のURLが本当に必要な場合は、次の拡張メソッドを使用できます。
public static class HttpRequestExtensions
{
public static Uri GetRawUrl(this HttpRequest request)
{
var httpContext = request.HttpContext;
var requestFeature = httpContext.Features.Get<IHttpRequestFeature>();
return new Uri(requestFeature.RawTarget);
}
}
このメソッドはRawTarget
、HttpRequest
オブジェクト自体には表示されないリクエストのを利用します。このプロパティは、ASP.NETCoreの1.0.0リリースで追加されました。それ以降のバージョンを実行していることを確認してください。
注意!このプロパティは生のURLを公開するため、ドキュメントに記載されているように、デコードされていません。
このプロパティは、ルーティングまたは承認の決定に内部的に使用されません。UrlDecodedされていないため、使用には注意が必要です。
RawTarget
で定義されていませんIHttpRequestFeature
)。代替案を考えられますか?
RawTarget
1.0リリースで追加され、5月に戻った。最新バージョンで実行していますか?
.NET Coreかみそりの場合:
@using Microsoft.AspNetCore.Http.Extensions
@Context.Request.GetEncodedUrl() //Use for any purpose (encoded for safe automation)
2行目の代わりに使用することもできます。
@Context.Request.GetDisplayUrl() //Use to display the URL only
他のソリューションは、URI
オブジェクトを直接必要としていたため、私のニーズにうまく適合しませんでした。この場合、文字列の連結を回避する方がよいと思います。そのため、を使用するよりもこの拡張メソッドを作成し、次のUriBuilder
ようなURLでも機能しますhttp://localhost:2050
。
public static Uri GetUri(this HttpRequest request)
{
var uriBuilder = new UriBuilder
{
Scheme = request.Scheme,
Host = request.Host.Host,
Port = request.Host.Port.GetValueOrDefault(80),
Path = request.Path.ToString(),
Query = request.QueryString.ToString()
};
return uriBuilder.Uri;
}
(80)
である必要があります(-1)
。「Host」ヘッダーでポートが省略されたhttpsスキームがある場合、これは間違ったUriを生成します(たとえばhttps://myweb:80/
、(-1)
それを使用するとhttps://myweb
)。
次の拡張メソッドは、pre-beta5のロジックを再現していますUriHelper
。
public static string RawUrl(this HttpRequest request) {
if (string.IsNullOrEmpty(request.Scheme)) {
throw new InvalidOperationException("Missing Scheme");
}
if (!request.Host.HasValue) {
throw new InvalidOperationException("Missing Host");
}
string path = (request.PathBase.HasValue || request.Path.HasValue) ? (request.PathBase + request.Path).ToString() : "/";
return request.Scheme + "://" + request.Host + path + request.QueryString;
}
この拡張機能は私のために機能します:
Microsoft.AspNetCore.Httpを使用する;
public static class HttpRequestExtensions
{
public static string GetRawUrl(this HttpRequest request)
{
var httpContext = request.HttpContext;
return $"{httpContext.Request.Scheme}://{httpContext.Request.Host}{httpContext.Request.Path}{httpContext.Request.QueryString}";
}
}