public WebSocketRoutingService(List <Type> controllers) { var methods = controllers.SelectMany(t => t.GetMethods().Where(m => m.GetCustomAttributes(false).OfType <WebSocketRouteAttribute>().Any())).ToList(); methods.ForEach(m => { var route = new WebSocketRoute(m); var attr = m.GetCustomAttributes(false).OfType <WebSocketRouteAttribute>().First() as WebSocketRouteAttribute; var template = @"^"; var segments = attr.Template.Split('/', StringSplitOptions.RemoveEmptyEntries).ToList(); for (var x = 0; x < segments.Count; x++) { var segmentx = segments[x]; if (!segmentx.ContainsAny("?", "#", "&")) { var segment = WebSocketRouteSegment.Create(x, segmentx); route.Segments.Add(segment); template += $"\\/{segment.Value}"; } } template += ".*$"; route.Matcher = new Regex(template, RegexOptions.IgnoreCase | RegexOptions.Compiled); _routes.Add(route); }); }
public static WebSocketRouteSegment Create(int order, string template) { var segment = new WebSocketRouteSegment { Order = order, Template = template, Name = template.TrimStart('{').TrimEnd('}'), IsParameter = template.StartsWith("{") && template.EndsWith("}") }; segment.Value = segment.IsParameter ? $"(?<{segment.Name}>.*)" : segment.Name; return(segment); }