ASP.NET Coreでサイトのbaseurlを取得するにはどうすればいいですか?

私のウェブサイトが www.example.commywebsite フォルダーにホストされていて、私が https://www.example.com/mywebsite/home/about にアクセスしたとします。

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

ASP.NET CoreではRequest.Urlにアクセスできないため、こちらに記載されている例は動作しません。

ソリューション

それでも、必要なものをまとめることができるはずです。コントローラが 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"メソッドに興味のあるものを入れただけですが、リクエストクラスの他の部分も調べて、他にどんなものがあるか知っておいてください。

しかし、IISIntegrationパッケージやAzureAppServicesパッケージを使用すれば(Nugetパッケージをインストールして、WebHostBuilderのProgram.csに追加すれば)、これらのヘッダを転送してくれるはずです。Azureでは、どのホスト名にヒットしたかで判断しなければならないことがあるので、この機能はとても便利です。IIS/Azureパッケージは、オリジナルのリモートIPアドレスも転送し、それを記録します。

解説 (4)

これがアプリのどこかで必要な場合は、ミドルウェアを構築する必要があります。 ミドルウェアをサービスパイプラインに追加するために、スタティッククラスとエクステンションメソッドを以下のように定義します。

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();
    }

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

この場合、HttpContextを公開するのは少し冗長かもしれませんが、私はとても便利だと思います。

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

app.UseHttpContext()

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

var appBaseUrl = MyHttpContext.AppBaseUrl;
解説 (5)
string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));

は、こちらで詳細をご確認いただけます。 https://stackoverflow.com/questions/1288046/how-can-i-get-my-webapps-base-url-in-asp-net-mvc

解説 (2)