Advertisement
Guest User

Untitled

a guest
Jun 15th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.72 KB | None | 0 0
  1. public class AreaRouter : MvcRouteHandler, IRouter
  2. {
  3. private readonly string[] _allowedSubdomains = { "Admin" };
  4. private readonly IActionContextAccessor _actionContextAccessor;
  5. private readonly IActionInvokerFactory _actionInvokerFactory;
  6. private readonly IActionSelector _actionSelector;
  7. private ILogger _logger;
  8. private DiagnosticSource _diagnosticSource;
  9.  
  10.  
  11. public AreaRouter(
  12. IActionInvokerFactory actionInvokerFactory,
  13. IActionSelector actionSelector,
  14. DiagnosticSource diagnosticSource,
  15. ILoggerFactory loggerFactory)
  16. : this(actionInvokerFactory, actionSelector, diagnosticSource, loggerFactory, actionContextAccessor: null)
  17. {
  18. }
  19.  
  20. public AreaRouter(IActionInvokerFactory actionInvokerFactory, IActionSelector actionSelector, DiagnosticSource diagnosticSource,
  21. ILoggerFactory loggerFactory, IActionContextAccessor actionContextAccessor)
  22. : base(actionInvokerFactory, actionSelector, diagnosticSource,
  23. loggerFactory, actionContextAccessor)
  24. {
  25. _actionContextAccessor = actionContextAccessor;
  26. _actionInvokerFactory = actionInvokerFactory;
  27. _actionSelector = actionSelector;
  28. _diagnosticSource = diagnosticSource;
  29. _logger = loggerFactory.CreateLogger<MvcRouteHandler>();
  30. }
  31.  
  32. public new Task RouteAsync(RouteContext context)
  33. {
  34. if (context == null)
  35. {
  36. throw new ArgumentNullException(nameof(context));
  37. }
  38. string url = context.HttpContext.Request.Headers["HOST"];
  39. string firstDomain = url.Split('.')[0];
  40. string subDomain = char.ToUpper(firstDomain[0]) + firstDomain.Substring(1);
  41. if (_allowedSubdomains.Contains(subDomain))
  42. {
  43. if (context.RouteData.Values.TryGetValue("area", out var area))
  44. {
  45. if (!area.Equals(subDomain.ToLowerInvariant()))
  46. context.RouteData.Values.Add("area", subDomain);
  47. }
  48. else
  49. {
  50. context.RouteData.Values.Add("area", subDomain);
  51. context.RouteData.Values["controller"] = "Dashboard";
  52. }
  53. }
  54.  
  55. var candidates = _actionSelector.SelectCandidates(context);
  56. if (candidates == null || candidates.Count == 0)
  57. {
  58. return Task.CompletedTask;
  59. }
  60.  
  61. var actionDescriptor = _actionSelector.SelectBestCandidate(context, candidates);
  62. if (actionDescriptor == null)
  63. {
  64. return Task.CompletedTask;
  65. }
  66.  
  67. context.Handler = (c) =>
  68. {
  69. var routeData = c.GetRouteData();
  70.  
  71. var actionContext = new ActionContext(context.HttpContext, routeData, actionDescriptor);
  72. if (_actionContextAccessor != null)
  73. {
  74. _actionContextAccessor.ActionContext = actionContext;
  75. }
  76.  
  77. var invoker = _actionInvokerFactory.CreateInvoker(actionContext);
  78. if (invoker == null)
  79. {
  80. throw new InvalidOperationException();
  81. }
  82.  
  83. return invoker.InvokeAsync();
  84. };
  85.  
  86. return Task.CompletedTask;
  87. }
  88.  
  89. }
  90.  
  91. app.UseMvc(routes =>
  92. {
  93. routes.DefaultHandler = areaRouter;
  94. routes.MapRoute("areaRoute", "{area:exists}/{controller=Dashboard}/{action=Index}/{id?}");
  95. routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
  96. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement