Przeglądaj źródła

Fixed routing not matching default values

master
Teknikode 2 miesięcy temu
rodzic
commit
1757f04787

+ 1
- 1
Utilities/Routing/EndpointHelper.cs Wyświetl plik

@@ -30,7 +30,7 @@ namespace Teknik.Utilities.Routing
var defaults = mapping.Defaults as JObject;
foreach (var defaultVal in defaults)
{
defaultObj.TryAdd(defaultVal.Key, defaultVal.Value);
defaultObj.TryAdd(defaultVal.Key, defaultVal.Value.ToObject<object>());
}
}
defaultObj.TryAdd("area", mapping.Area);

+ 0
- 106
Utilities/Routing/SubdomainRoute.cs Wyświetl plik

@@ -1,106 +0,0 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNetCore.Routing;
using Teknik.Utilities;

namespace Teknik.Utilities.Routing
{
public class SubdomainRoute : Route
{
private readonly IRouter _target;

public List<string> Subdomains { get; set; }

public List<string> Domains { get; set; }

public SubdomainRoute(List<string> subdomains, List<string> domains, IRouter router, string routeTemplate, IInlineConstraintResolver inlineConstraintResolver)
: base(router, routeTemplate, inlineConstraintResolver)
{
this.Subdomains = subdomains;
this.Domains = domains;
this._target = router;
}

public SubdomainRoute(List<string> subdomains, List<string> domains, IRouter router, string routeTemplate, RouteValueDictionary defaults, IDictionary<string, object> constraints, RouteValueDictionary dataTokens, IInlineConstraintResolver inlineConstraintResolver)
: base(router, routeTemplate, defaults, constraints, dataTokens, inlineConstraintResolver)
{
this.Subdomains = subdomains;
this.Domains = domains;
this._target = router;
}

public SubdomainRoute(List<string> subdomains, List<string> domains, IRouter router, string routeName, string routeTemplate, RouteValueDictionary defaults, IDictionary<string, object> constraints, RouteValueDictionary dataTokens, IInlineConstraintResolver inlineConstraintResolver)
: base(router, routeName, routeTemplate, defaults, constraints, dataTokens, inlineConstraintResolver)
{
this.Subdomains = subdomains;
this.Domains = domains;
this._target = router;
}

protected override Task OnRouteMatched(RouteContext context)
{
// Only look at the subdomain if there is any route data.
if (context.RouteData != null)
{
string subdomain = context.HttpContext.Request.Query["sub"]; // A subdomain specified as a query parameter takes precedence over the hostname.
string host = context.HttpContext.Request.Headers["Host"];

if (host != null)
{
string domain = host.GetDomain();
string curSub = host.GetSubdomain();

// special consideration for 'dev' subdomain
if (subdomain == null || subdomain == "dev")
{
if (!string.IsNullOrEmpty(curSub) && curSub == "dev")
{
// if we are on dev, and the param is dev or empty, we need to initialize it to 'www'
subdomain = "www";
}
}

if (subdomain == null)
{
subdomain = curSub;
}
else
{
if (context.RouteData.Values["sub"] == null)
{
context.RouteData.Values["sub"] = subdomain;
}
else
{
subdomain = context.RouteData.Values["sub"].ToString();
}
}

// Check if this route is valid for the current domain
if (context.HttpContext.Request.IsLocal() || Domains.Contains(domain))
{
// Check if this route is valid for the current subdomain ('*' means any subdomain is valid)
if (Subdomains.Contains("*") || Subdomains.Contains(subdomain))
{
context.RouteData.Values["sub"] = subdomain;
context.RouteData.Routers.Add(_target);
return _target.RouteAsync(context);
}
}
}
}
return Task.CompletedTask;
}

public override VirtualPathData GetVirtualPath(VirtualPathContext context)
{
object subdomainParam = context.HttpContext.Request.Query["sub"];
if (subdomainParam != null && context.Values["sub"] == null)
context.Values["sub"] = subdomainParam;
return base.GetVirtualPath(context); // we now have the route based on subdomain
}
}
}

+ 0
- 41
Utilities/Routing/SubdomainRouteExtension.cs Wyświetl plik

@@ -1,41 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using System.Collections.Generic;

namespace Teknik.Utilities.Routing
{
public static class SubdomainRouteExtension
{
public static SubdomainRoute MapSubdomainRoute(this IRouteBuilder routeBuilder, string name, List<string> subDomains, List<string> domains, string template, object defaults)
{
return MapSubdomainRoute(routeBuilder, name, subDomains, domains, template, defaults, new { }, new { });
}

public static SubdomainRoute MapSubdomainRoute(this IRouteBuilder routeBuilder, string name, List<string> subDomains, List<string> domains, string template, object defaults, object constraints)
{
return MapSubdomainRoute(routeBuilder, name, subDomains, domains, template, defaults, constraints, new { });
}

public static SubdomainRoute MapSubdomainRoute(this IRouteBuilder routeBuilder, string name, List<string> subDomains, List<string> domains, string template, object defaults, object constraints, object dataTokens)
{
var inlineConstraintResolver = routeBuilder.ServiceProvider.GetRequiredService<IInlineConstraintResolver>();

SubdomainRoute route = new SubdomainRoute(
subDomains,
domains,
routeBuilder.DefaultHandler,
name,
template,
new RouteValueDictionary(defaults),
new RouteValueDictionary(constraints),
new RouteValueDictionary(dataTokens),
inlineConstraintResolver);

routeBuilder.Routes.Add(route);

return route;
}
}
}

+ 11
- 2
Utilities/Routing/UrlExtensions.cs Wyświetl plik

@@ -9,6 +9,7 @@ using System.Web;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.AspNetCore.Routing;
using Newtonsoft.Json.Linq;

namespace Teknik.Utilities.Routing
{
@@ -57,10 +58,18 @@ namespace Teknik.Utilities.Routing

// Get the endpoint mapping
var mapping = EndpointHelper.GetEndpointMapping(routeName);
if (mapping != null &&
!routeValueDict.ContainsKey("area"))
if (mapping != null)
{
routeValueDict.TryAdd("area", mapping.Area);

if (mapping.Defaults != null)
{
var defaults = mapping.Defaults as JObject;
foreach (var defaultVal in defaults)
{
routeValueDict.TryAdd(defaultVal.Key, defaultVal.Value.ToObject<object>());
}
}
}

var path = linkGen.GetPathByAddress(url.ActionContext.HttpContext, routeName, routeValueDict);

Ładowanie…
Anuluj
Zapisz