web-dev-qa-db-ja.com

Request.RequestURIと同等のASP.NET Core MVCとは何ですか?

ブログ投稿 を見つけました。これは、HttpResponseMessageのような使い慣れたものをASP.NET Core MVCに「シム」する方法を示していますが、次のコードと同じことを行う新しいネイティブな方法を知りたいですREST ControllerのPostメソッド:

_// POST audit/values
[HttpPost]
public System.Net.Http.HttpResponseMessage Post([FromBody]string value)
{
    var NewEntity = _repository.InsertFromString(value);

    var msg = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Created);
    msg.Headers.Location = new Uri(Request.RequestUri + NewEntity.ID.ToString());
    return msg;

}
_

ASP.NET Core MVCプロジェクトでは、Request.RequestUriを取得できないようです。

Requestを調べてみたところ、次のような関数を作成できました。

_private string UriStr(HttpRequest Request)
{
    return Request.Scheme + "://" + Request.Host + Request.Path; // Request.Path has leading /
}
_

そのため、代わりにUriStr(Request)と書くことができます。しかし、私はそれが正しいかどうかわかりません。私は自分の道をハッキングしていて、これを正しく使用していないように感じます。

関連する質問 以前の非コアASP.NET MVCバージョンの場合、サイトのベースURLを取得する方法を尋ねます。

32
Warren P

よりクリーンな方法は、UriBuilderを使用することです。

private static Uri GetUri(HttpRequest request)
{
    var builder = new UriBuilder();
    builder.Scheme = request.Scheme;
    builder.Host = request.Host.Value;
    builder.Path = request.Path;
    builder.Query = request.QueryString.ToUriComponent();
    return builder.Uri;
}

(テストされていないため、コードの調整が必要になる場合があります)

15
Thomas Levesque

個人的に、私は使用します:

new Uri(request.GetDisplayUrl())

GetDisplayUrlは、次の名前空間の拡張メソッドです:Microsoft.AspNetCore.Http.Extensions

55
t.ouvre

これが動作するコードです。これは@Thomas Levesqueの回答に基づいていますが、リクエストがカスタムポートからのものである場合はうまく機能しませんでした。

public static class HttpRequestExtensions
{
    public static Uri ToUri(this HttpRequest request)
    {
        var hostComponents = request.Host.ToUriComponent().Split(':');

        var builder = new UriBuilder
        {
            Scheme = request.Scheme,
            Host = hostComponents[0],
            Path = request.Path,
            Query = request.QueryString.ToUriComponent()
        };

        if (hostComponents.Length == 2)
        {
            builder.Port = Convert.ToInt32(hostComponents[1]);
        }

        return builder.Uri;
    }
}
11
Dealdiane