public ApiGraph Build(IEnumerable <Type> controllerTypes) { var controllers = new List <ControllerElement>(); foreach (var controllerType in controllerTypes) { var methods = new List <MethodElement>(); var methodInfos = controllerType.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); foreach (var methodInfo in methodInfos) { ParameterElement bodyParameter = null; var urlParameters = new List <ParameterElement>(); var fullRoute = GetFullRoute(controllerType, methodInfo); var methodName = methodInfo.Name.EndsWith("Async") ? methodInfo.Name.Substring(0, methodInfo.Name.Length - 5) : methodInfo.Name; foreach (var parameter in methodInfo.GetParameters()) { if (parameter.GetCustomAttribute <FromUriAttribute>() != null || RouteUtility.GetPlaceholders(parameter.Name).Any(fullRoute.Contains)) { urlParameters.Add(new ParameterElement(parameter.Name, parameter.ParameterType, !parameter.HasDefaultValue)); } else if (bodyParameter == null) { bodyParameter = new ParameterElement(parameter.Name, parameter.ParameterType, true); } else { throw new Exception("Multiple body parameters detected for " + methodInfo.Name); } } methods.Add(new MethodElement( GetHttpMethod(methodInfo), methodName, fullRoute, urlParameters, bodyParameter, TryGetReturnType(controllerType, methodInfo))); } var controllerName = controllerType.Name.Substring(0, controllerType.Name.Length - ControllerSuffix.Length); controllers.Add(new ControllerElement(controllerName, methods)); } return(new ApiGraph(controllers)); }
public override void Application_BeginRequest(object sender, EventArgs e) { var context = HttpContext.Current; var request = context.Request; var response = context.Response; var application = context.Application; string domainName = RouteUtility.DomainName(context); var allPages = PageUtility.GetAllPages(); var currentPage = allPages.FirstOrDefault(x => x.RouteValue == domainName); if (currentPage == null) { return; } if (request.Url.ToString().Contains(".ashx") || request.Url.ToString().Contains(".axd") || request.Url.ToString().Contains(".asmx") || request.Url.ToString().Contains("DataSource")) { return; } base.Application_BeginRequest(sender, e); #region Check RouteMap var siteMapLastUpdate = (SiteMapLastUpdateViewModel)application["SiteMapLastUpdate"]; var siteMapLastUpdateFromService = UnigateObject.Query("SiteMapLastUpdate").FirstOrDefault <SiteMapLastUpdateViewModel>(); if (siteMapLastUpdateFromService.SiteRedirectLastUpdateDate > siteMapLastUpdate.SiteRedirectLastUpdateDate) { if (Monitor.TryEnter(ObjectLockSiteRedirect)) { if (siteMapLastUpdateFromService.SiteRedirectLastUpdateDate > siteMapLastUpdate.SiteRedirectLastUpdateDate) { FillRedirects(); siteMapLastUpdate.SiteLanguageLastUpdateDate = siteMapLastUpdateFromService.SiteRedirectLastUpdateDate; application["SiteMapLastUpdate"] = siteMapLastUpdate; } Monitor.Exit(ObjectLockSiteRedirect); } } #endregion #region Site Redirect Check var redirects = application[AppRedirectName] as List <SiteRedirectModel>; if (redirects == null) { redirects = new List <SiteRedirectModel>(); } var redirectUrl = redirects.FirstOrDefault(i => i.LocalAddress == request.Path.ToLowerInvariant()); if (redirectUrl != null && !string.IsNullOrEmpty(redirectUrl.LocalAddress)) { //İlgili domain için yönlendirme yapılmalı if (redirectUrl.PageId != currentPage.Id) { return; } var siteRedirect = redirectUrl; if (siteRedirect.TransferQuerystring) { if (!siteRedirect.IsTemporary) { response.RedirectPermanent(siteRedirect.RouteAddress + request.Url.Query); } else { response.Redirect(siteRedirect.RouteAddress + request.Url.Query); } } else { if (siteRedirect.IsTemporary == true) { response.RedirectPermanent(siteRedirect.RouteAddress); } else { response.Redirect(siteRedirect.RouteAddress); } } } else { var siteRedirectsWithAsterisk = (application[AppRedirectName] as List <SiteRedirectModel>).Where(x => x.LocalAddress.Contains("*")); var siteRedirect = siteRedirectsWithAsterisk.FirstOrDefault(delegate(SiteRedirectModel s) { var regexString = String.Format(@"^{0}$", s.LocalAddress.Trim().Replace("*", "(.*)")); var isMached = Regex.IsMatch(request.Path.ToLowerInvariant(), regexString); return(isMached); }); if (siteRedirect != null) { //İlgili domain için yönlendirme yapılmalı if (siteRedirect.PageId != currentPage.Id) { return; } var is301 = !siteRedirect.IsTemporary; string responseStatus = string.Empty; if (is301) { responseStatus = "301 Moved Permanently"; } else { responseStatus = "302 Moved Temprorarily"; } response.Status = responseStatus; if (siteRedirect.TransferQuerystring) { if (is301) { response.RedirectPermanent(siteRedirect.RouteAddress + request.Url.Query); } else { response.Redirect(siteRedirect.RouteAddress + request.Url.Query); } } else { if (is301) { response.RedirectPermanent(siteRedirect.RouteAddress); } else { response.Redirect(siteRedirect.RouteAddress); } } } else { application["Redirects"] = redirects; } } #endregion }
/// <summary> /// Main entrypoint for application. Initializes RouteUtility class and solves an example route. /// </summary> /// <param name="args">Optional command line arguments.</param> private static void Main(string[] args) { routeUtil = new RouteUtility(routeService, SpatialRefTypes.GCS_North_American_1983); RunRouteTask(); Console.ReadLine(); }
public static string GetRouteBuilder(MethodElement method) { var route = "'" + method.Route + "'"; var queryParameters = method.UrlParameters.ToList(); foreach (var urlParameter in method.UrlParameters) { foreach (var placeholder in RouteUtility.GetPlaceholders(urlParameter.Name)) { if (!route.Contains(placeholder)) { continue; } queryParameters.Remove(urlParameter); route = route.Replace(placeholder, string.Format("' + encodeURIComponent({0}) + '", urlParameter.Name)); break; } } if (route.StartsWith("'' + ")) { route = route.Substring(5); } if (route.EndsWith(" + ''")) { route = route.Substring(0, route.Length - 5); } if (queryParameters.Count > 0) { if (route.EndsWith("'")) { route = route.Substring(0, route.Length - 1); route += "?'"; } else { route += " + '?'"; } foreach (var parameter in queryParameters) { if (parameter.Type.IsPrimitiveEx()) { route += string.Format( " + ({0} === undefined ? '' : '{0}=' + encodeURIComponent({0}) + '&')", parameter.Name); } else { // Flatten complex types used as URL parameters. var flattenedComplexType = parameter.Type.GetProperties().Where(_ => _.PropertyType.IsPrimitiveEx() && _.CanWrite); foreach (var property in flattenedComplexType) { route += string.Format( " + ({0} === undefined ? '' : '{1}=' + encodeURIComponent({0}) + '&')", parameter.Name + "." + property.Name.Camelize(), property.Name.Camelize()); } } } } return route; }