web-dev-qa-db-ja.com

ASP.NET CoreでサイトのベースURLを取得するにはどうすればよいですか?

私のウェブサイトはmywebsiteフォルダーwww.example.comそして、私は https://www.example.com/mywebsite/home/about にアクセスします。

MVCコントローラーでベースURL部分を取得するにはどうすればよいですか?私が探している部分はhttps://www.example.com/mywebsite

リストされている例 here は、ASP.NET CoreのRequest.Urlにアクセスできないため機能しません

33
jao

必要なものをつなぎ合わせることができるはずです。コントローラーがControllerを継承する場合、リクエストオブジェクトにアクセスできます。

VS2017を使用している場合は、新しいASPNet Core MVCアプリを起動し、homecontrollerを次のものに置き換えます。

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public IActionResult About()
    {
        ViewData["Message"] = $"{this.Request.Scheme}://{this.Request.Host}{this.Request.PathBase}";

        return View();
    }

    public IActionResult Contact()
    {
        ViewData["Message"] = "Your contact page.";

        return View();
    }

    public IActionResult Error()
    {
        return View();
    }
}

「About」メソッドに興味があるかもしれないものをいくつか紹介しましたが、リクエストクラスの残りの部分を調べて、他に何が利用できるかを知っておく必要があります。

@Tsengが指摘したように、IISまたはAzure App Serviceの背後でKestrelを実行すると問題が発生する可能性がありますが、IISIntegrationパッケージまたはAzureAppServicesパッケージを使用する場合(NugetパッケージをインストールしてProgram.csに追加することにより) WebHostBuilderに)、それらのヘッダーを転送する必要があります。 Azureでうまく機能するのは、ヒットするホスト名に基づいて決定を下す必要がある場合があるためです。 IIS/Azureパッケージは、ログに記録する元のリモートIPアドレスも転送します。

67
NPNelson

アプリのどこでもこれが必要な場合は、ミドルウェアを構築する必要があります。このようにサービスパイプラインにミドルウェアを追加するための静的クラスと拡張メソッドを定義します。

public class MyHttpContext
{
    private static IHttpContextAccessor m_httpContextAccessor;

    public static HttpContext Current => m_httpContextAccessor.HttpContext;

    public static string AppBaseUrl => $"{Current.Request.Scheme}://{Current.Request.Host}{Current.Request.PathBase}";

    internal static void Configure(IHttpContextAccessor contextAccessor)
    {
        m_httpContextAccessor = contextAccessor;
    }
}

public static class HttpContextExtensions
{
    public static void AddHttpContextAccessor(this IServiceCollection services)
    {
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    }

    public static IApplicationBuilder UseHttpContext(this IApplicationBuilder app)
    {
        MyHttpContext.Configure(app.ApplicationServices.GetRequiredService<IHttpContextAccessor>());
        return app;
    }
}

この場合、HttpContextを公開するのは少し冗長かもしれませんが、非常に役立ちます。

Startup.csにあるConfigfureメソッドのパイプラインに追加します。

app.UseHttpContext()

そこからコードのどこにでも簡単に使用できます。

var appBaseUrl = MyHttpContext.AppBaseUrl;
13
Rob

NPNelsonの答えは、.Value.ToString()を使用すると機能します。

var baseUrl = $"{this.Request.Scheme}://{this.Request.Host.Value.ToString()}{this.Request.PathBase.Value.ToString()}";
0
hubert17