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
        }
示例#3
0
 /// <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;
        }