Katakanlah situs web saya di-host di folder mywebsite dari www.example.com dan saya mengunjungi https://www.example.com/mywebsite/home/about.
Bagaimana cara mendapatkan bagian url dasar dalam kontroler MVC? Bagian yang saya cari adalah https://www.example.com/mywebsite
Contoh yang tercantum di sini tidak berfungsi karena kita tidak memiliki akses ke Request.Url di ASP.NET Core
Anda seharusnya masih bisa mengumpulkan apa yang Anda butuhkan. Anda memiliki akses ke objek permintaan jika controller Anda mewarisi dari Controller
.
Jika Anda menggunakan VS2017, jalankan aplikasi ASPNet Core MVC baru dan ganti homecontroller dengan:
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();
}
}
Saya hanya memasukkan beberapa hal yang mungkin menarik bagi Anda dalam metode "About", tetapi Anda harus menjelajahi sisa kelas permintaan sehingga Anda tahu apa lagi yang tersedia.
Seperti yang ditunjukkan @Tseng, Anda mungkin memiliki masalah saat menjalankan Kestrel di belakang IIS atau Azure App Service, tetapi jika Anda menggunakan paket IISIntegration atau paket AzureAppServices (dengan menginstal paket Nuget dan menambahkannya di Program.cs ke WebHostBuilder Anda), itu akan meneruskan header tersebut kepada Anda. Ini bekerja dengan baik untuk saya di Azure, karena saya terkadang harus membuat keputusan berdasarkan nama host mana yang mereka tuju. Paket IIS/Azure juga meneruskan alamat IP jarak jauh asli, yang saya catat.
Jika Anda membutuhkan ini di mana saja di aplikasi Anda, maka Anda harus membangun middleware. Definisikan kelas statis dan metode ekstensi Anda untuk menambahkan middleware ke pipeline layanan seperti ini.
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;
}
}
Mungkin sedikit berlebihan untuk mengekspos HttpContext dalam kasus ini tetapi saya merasa sangat membantu.
Anda kemudian akan menambahkannya ke pipeline dalam metode Configfure Anda yang terletak di Startup.cs
app.UseHttpContext()
Dari sana, mudah untuk menggunakannya di mana saja dalam kode Anda.
var appBaseUrl = MyHttpContext.AppBaseUrl;
string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));
Anda dapat memeriksa informasi lebih lanjut di sini: https://stackoverflow.com/questions/1288046/how-can-i-get-my-webapps-base-url-in-asp-net-mvc