区和子域路由

问题描述:

我创建管理区我的ASP.NET核心应用内更新了我的路线这样的:区和子域路由

app.UseMvc(routes => 
{ 
    routes.MapRoute(name: "areaRoute", 
    template: "{area:exists}/{controller=Home}/{action=Index}"); 

    routes.MapRoute(
     name: "default", 
     template: "{controller=Home}/{action=Index}"); 
}); 

我想实现我为了应用程序内的子域路由,当我们键入URL管理.mysite.com,我呈现我的管理区域(mysite.com/admin)。

我看到了很多例子了ASP.NET MVC 5,但我一直没能为ASP.NET核心适应。

+3

请使用[标签:asp.net核-MVC]在未来,而不是[标签:asp.net,MVC] – Tseng

迈克尔·格拉夫有a blog post了。

Basicly你需要一个定制的路由器:

public class AreaRouter : MvcRouteHandler, IRouter 
{ 
    public new async Task RouteAsync(RouteContext context) 
    { 
     string url = context.HttpContext.Request.Headers["HOST"]; 
     var splittedUrl = url.Split('.'); 

     if (splittedUrl.Length > 0 && splittedUrl[0] == "admin") 
     { 
      context.RouteData.Values.Add("area", "Admin"); 
     } 

     await base.RouteAsync(context); 
    } 
} 

,然后注册它。

app.UseMvc(routes => 
{ 
    routes.DefaultHandler = new AreaRouter(); 
    routes.MapRoute(name: "areaRoute", 
     template: "{controller=Home}/{action=Index}"); 
}); 

在另一方面,我们有IIS Rewrite module,甚至Middleware

我想最后的解决方案和ASP.NET 1.1的核心

微软没有工作具有的NuGet包命名重写,中间件在那里你可以重写或重定向一些请求,也有写一个自定义规则,在那里你可以捕捉到子域名,并将其添加到请求路径的方式:

public class RewriteSubdomainRule : IRule 
    { 
     public void ApplyRule(RewriteContext context) 
     { 
      var request = context.HttpContext.Request; 
      var host = request.Host.Host; 
      // Check if the host is subdomain.domain.com or subdomain.localhost for debugging 
      if (Regex.IsMatch(host, @"^[A-Za-z\d]+\.(?:[A-Za-z\d]+\.[A-Za-z\d]+|localhost)$")) 
      { 
       string subdomain = host.Split('.')[0]; 
       //modifying the request path to let the routing catch the subdomain 
       context.HttpContext.Request.Path = "/subdomain/" + subdomain + context.HttpContext.Request.Path; 
       context.Result = RuleResult.ContinueRules; 
       return; 
      } 
      context.Result = RuleResult.ContinueRules; 
      return; 
     } 
    } 

在Startup.cs

您必须添加中间件使用的自定义重写规则:

app.UseRewriter(new RewriteOptions().Add(new RewriteSubdomainRule())); 

这行后,我确定接收的请求添加的子域的路由路径,并将其分配给子域变量:

app.UseMvc(routes => 
    { 
     routes.MapRoute(
      name: "default", 
      template: "{controller=Home}/{action=Index}/{id?}"); 

     routes.MapRoute(
      name: "subdomain", 
      template: "subdomain/{subdomain}/{controller=Home}/{action=Index}/{id?}"); 
    }); 

在控制器,你可以使用它像这样

public async Task<IActionResult> Index(int? id, string subdomain) 
{ 
} 

很好的解决塞尔吉奥能够创建子域的路由。 只需添加到您的解决方案并完成到物理目录的子域路由。

public class HomeController : Controller 
    { 
     public async Task<IActionResult> Index(int? id, string subdomain) 
     { 
      if (!string.IsNullOrWhiteSpace(subdomain)) 
      { 
       if(subdomain=="admin") 
       return View("~/wwwrootadmin/index.cshtml"); 
      } 
      return View("~/wwwroot/index.cshtml"); 
     } 
    } 

然后wwwrootadmin必须创建与您的子文件的文件。还记得为了路由事项的顺序app.UseMvc()内