Пример #1
0
        static VersionHandlingHttpControllerSelector()
        {
            Assembly  currentAssembly         = typeof(VersionHandlingHttpControllerSelector).Assembly;
            string    currentAssemblyLocation = currentAssembly.Location;
            string    currentAssemblyName     = currentAssembly.GetName().Name;
            string    controllersXMLPath      = ControllersXMLPath.IsNotNullOrEmpty() ? ControllersXMLPath : Path.Combine(currentAssemblyLocation, "ControllerDispatchment", "ControllerEntityVersionsAndNamesMapping", "ControllerEntityVersionsAndNamesMapping.xml");
            XDocument xDocForControllersXML   = XDocument.Load(controllersXMLPath);

            _controllersXML = XMLUtility.DeSerialize <ControllersXML>(xDocForControllersXML.ToString());
            string controllersXSDPath         = ControllersXSDPath.IsNotNullOrEmpty() ? ControllersXSDPath : ("RestfulWebAPI.ControllerDispatchment.ControllerEntityVersionsAndNamesMapping.ControllerEntityVersionsAndNamesMapping.xsd");
            string controllersXSDAssemblyName = ControllersXSDAssemblyName.IsNotNullOrEmpty() ? ControllersXSDAssemblyName : currentAssemblyName;
            string xmlValidationErrors        = XSDUtility.Validate(controllersXSDAssemblyName, ControllersXSDPath, xDocForControllersXML.ToString());

            if (xmlValidationErrors.IsNotNullOrEmpty())
            {
                HttpResponseUtility.ThrowHttpResponseError(HttpStatusCode.InternalServerError, xmlValidationErrors);
            }

            string    entitiesXMLPath    = EntitiesXMLPath.IsNotNullOrEmpty() ? EntitiesXMLPath : Path.Combine(currentAssemblyLocation, "ControllerDispatchment", "ControllerEntityVersionsAndNamesMapping", "EntitiesAndIDTypesMapping.xml");
            XDocument xDocForEntitiesXML = XDocument.Load(entitiesXMLPath);

            _entitiesXML = XMLUtility.DeSerialize <EntitiesXML>(xDocForEntitiesXML.ToString());
            string entitiesXSDPath         = EntitiesXSDPath.IsNotNullOrEmpty() ? EntitiesXSDPath : ("RestfulWebAPI.ControllerDispatchment.ControllerEntityVersionsAndNamesMapping.EntitiesAndIDTypesMapping.xsd");
            string entitiesXSDAssemblyName = EntitiesXSDAssemblyName.IsNotNullOrEmpty() ? EntitiesXSDAssemblyName : currentAssemblyName;

            xmlValidationErrors = XSDUtility.Validate(entitiesXSDAssemblyName, entitiesXSDPath, xDocForEntitiesXML.ToString());
            if (xmlValidationErrors.IsNotNullOrEmpty())
            {
                HttpResponseUtility.ThrowHttpResponseError(HttpStatusCode.InternalServerError, xmlValidationErrors);
            }

            //Register this cache in Unity DI Container with Singleton lifetime
            _cache = Container.Instance.Resolve <ICache <string, HttpControllerDescriptor> >();
        }
        private static PolicyBuilder BuildPolicyBuilderFromPollyTransientFailureExceptionsXMLFile()
        {
            return(ExceptionHandlingUtility.WrapFuncWithExceptionHandling(() =>
            {
                PolicyBuilder policyBuilder = null;
                XDocument xDoc = XDocument.Load(Path.Combine(typeof(BasicPollyExceptionHandler).Assembly.Location, "ExceptionHandling", "PollyBasedExceptionHandling", "PollyTransientFailureExceptions.xml"));
                _pollyTransientFailureExceptions = XMLUtility.DeSerialize <PollyTransientFailureExceptions>(xDoc.ToString());
                _splittedTransientFailureExceptions = _pollyTransientFailureExceptions.TransientFailureExceptions.SelectMany(x => x.CommaSeperatedTransientFailureExceptions.Split(",", StringSplitOptions.RemoveEmptyEntries)).Distinct();

                if (_splittedTransientFailureExceptions.IsNotNullOrEmpty())
                {
                    string firstTransientFailureException = _splittedTransientFailureExceptions.First();
                    string assemblyName = _pollyTransientFailureExceptions.TransientFailureExceptions.SingleOrDefault(x => x.CommaSeperatedTransientFailureExceptions.Contains(firstTransientFailureException)).AssemblyName;
                    Type firstTransientFailureExceptionType = MetaDataUtility.GetType(assemblyName, firstTransientFailureException);
                    Type[] transientFailureExceptionTypesArray = new Type[1];
                    transientFailureExceptionTypesArray[0] = firstTransientFailureExceptionType;
                    policyBuilder = MetaDataUtility.InvokeStaticMethod <Policy, PolicyBuilder>("Handle", transientFailureExceptionTypesArray);

                    IEnumerable <string> transientFailureExceptionsOtherThanTheFirst = _splittedTransientFailureExceptions.Skip(1);
                    if (transientFailureExceptionsOtherThanTheFirst.IsNotNullOrEmpty())
                    {
                        transientFailureExceptionsOtherThanTheFirst.ForEach(x =>
                        {
                            assemblyName = _pollyTransientFailureExceptions.TransientFailureExceptions.SingleOrDefault(y => y.CommaSeperatedTransientFailureExceptions.Contains(x)).AssemblyName;
                            Type transientFailureExceptionTypeForOtherThanTheFirst = MetaDataUtility.GetType(assemblyName, x);
                            Type[] transientFailureExceptionTypesArrayForOtherThanTheFirst = new Type[1];
                            transientFailureExceptionTypesArrayForOtherThanTheFirst[0] = transientFailureExceptionTypeForOtherThanTheFirst;
                            policyBuilder = MetaDataUtility.InvokeInstanceMethod <PolicyBuilder, PolicyBuilder>(policyBuilder, "Or", transientFailureExceptionTypesArrayForOtherThanTheFirst);
                        }
                                                                            );
                    }
                }
                return policyBuilder;
            }, _staticLoggerInstance));
        }