I finally got this working in .Net Core 2.1
Created a new router
public class SubdomainAreaRouter : MvcRouteHandler, IRouter
{
public SubdomainAreaRouter(IActionInvokerFactory actionInvokerFactory, IActionSelector actionSelector, DiagnosticSource diagnosticSource, ILoggerFactory loggerFactory) : base(actionInvokerFactory, actionSelector, diagnosticSource, loggerFactory)
{
}
public SubdomainAreaRouter(IActionInvokerFactory actionInvokerFactory, IActionSelector actionSelector, DiagnosticSource diagnosticSource, ILoggerFactory loggerFactory, IActionContextAccessor actionContextAccessor) : base(actionInvokerFactory, actionSelector, diagnosticSource, loggerFactory, actionContextAccessor)
{
}
public new async Task RouteAsync(RouteContext context)
{
string url = context.HttpContext.Request.Headers["HOST"];
var splittedUrl = url.Split('.');
if (splittedUrl != null && (splittedUrl.Length > 0 && splittedUrl[0] == "admin"))
{
context.RouteData.Values.Add("area", "Admin");
}
await base.RouteAsync(context);
}
}
In Startup.cs, add the following into the ConfigureServices method:
services.AddSingleton<SubdomainAreaRouter>();
In Startup.cs, pass in your new router into the Configure method and update the UseMvc logic to use your new router:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, SubdomainAreaRouter subdomainRouter)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSession();
app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.DefaultHandler = subdomainRouter;
routes.MapRoute(
"admin",
"{area:exists}/{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
"default",
"{controller=Home}/{action=Index}/{id?}");
});
}