예제 #1
0
        public virtual Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
        {
            var log = __log;

            try
            {
                if (context.Exception != null)
                {
                    try
                    {
                        new TelemetryClient().TrackException(context.Exception);
                    }
                    catch
                    {
                        // ignore errors reporting errors
                    }
                }

                var baseController = context.ExceptionContext?.ActionContext?.ControllerContext?.Controller as BaseController;

                if (baseController != null)
                {
                    log = baseController.Log;
                }

                if (context.Exception != null &&
                    ErrorHandlerAttribute.IsAccessDeniedException(context.Exception))
                {
                    context.Result = new UnauthorizedResult(new AuthenticationHeaderValue[0], context.Request);
                }
            }
            catch (Exception ex)
            {
                //We had an error handling the error...
                log.ErrorFormat("Time: {0}, Message: {1}", DateTime.Now, ex);
            }
            return(Task.FromResult(0));
        }
예제 #2
0
        public void InitializeClient(Type interfaceType)
        {
            ConcurrentDictionary <string, ActionWrapper> concurrentDictionary1;

            if (RestWrapper.cache.TryGetValue(interfaceType, out concurrentDictionary1))
            {
                return;
            }
            ConcurrentDictionary <string, ActionWrapper> concurrentDictionary2 = new ConcurrentDictionary <string, ActionWrapper>();
            IRoutePrefix routePrefix = RestWrapper.GetRoutePrefix(interfaceType);

            this._errorInterceptor = interfaceType.GetCustomAttribute <ErrorHandlerAttribute>();
            this._serviceLocator.GetService <ILogger>()?.Message("Initializing client " + interfaceType.Name);
            RetryAttribute customAttribute = interfaceType.GetCustomAttribute <RetryAttribute>();

            if (interfaceType.GetCustomAttribute <CircuitBreakerAttribute>() != null)
            {
                CircuitBreakerContainer.Register(interfaceType, (ICircuitBreaker) new Stardust.Interstellar.Rest.Client.CircuitBreaker.CircuitBreaker(interfaceType.GetCustomAttribute <CircuitBreakerAttribute>(), this._serviceLocator)
                {
                    ServiceName = interfaceType.FullName
                });
            }
            else
            {
                CircuitBreakerContainer.Register(interfaceType, (ICircuitBreaker) new NullBreaker());
            }
            foreach (MethodInfo methodInfo in interfaceType.GetMethods().Length == 0 ? ((IEnumerable <Type>)interfaceType.GetInterfaces()).First <Type>().GetMethods() : interfaceType.GetMethods())
            {
                try
                {
                    RetryAttribute retryAttribute = methodInfo.GetCustomAttribute <RetryAttribute>() ?? customAttribute;
                    this._serviceLocator.GetService <ILogger>()?.Message("Initializing client action " + interfaceType.Name + "." + methodInfo.Name);
                    IRoute template             = (IRoute)methodInfo.GetCustomAttribute <IRouteAttribute>() ?? (IRoute)methodInfo.GetCustomAttribute <VerbAttribute>();
                    string actionName           = this.GetActionName(methodInfo);
                    List <VerbAttribute> list   = methodInfo.GetCustomAttributes(true).OfType <VerbAttribute>().ToList <VerbAttribute>();
                    ActionWrapper        action = new ActionWrapper()
                    {
                        Name          = actionName,
                        ReturnType    = methodInfo.ReturnType,
                        RouteTemplate = ExtensionsFactory.GetRouteTemplate(routePrefix, template, methodInfo, this._serviceLocator),
                        Parameters    = new List <ParameterWrapper>()
                    };
                    MethodInfo              method           = methodInfo;
                    IServiceProvider        serviceLocator   = this._serviceLocator;
                    List <HttpMethod>       httpMethods      = ExtensionsFactory.GetHttpMethods(list, method, serviceLocator);
                    List <IHeaderInspector> headerInspectors = ExtensionsFactory.GetHeaderInspectors(methodInfo, this._serviceLocator);
                    action.UseXml         = methodInfo.GetCustomAttributes().OfType <UseXmlAttribute>().Any <UseXmlAttribute>();
                    action.CustomHandlers = headerInspectors.Where <IHeaderInspector>((Func <IHeaderInspector, bool>)(h => this.headerHandlers.All <IHeaderHandler>((Func <IHeaderHandler, bool>)(parent => parent.GetType() != h.GetType())))).ToList <IHeaderInspector>();
                    action.ErrorHandler   = this._errorInterceptor;
                    action.Actions        = httpMethods;
                    if (retryAttribute != null)
                    {
                        action.Retry            = true;
                        action.Interval         = retryAttribute.RetryInterval;
                        action.NumberOfRetries  = retryAttribute.NumberOfRetries;
                        action.IncrementalRetry = retryAttribute.IncremetalWait;
                        if (retryAttribute.ErrorCategorizer != (Type)null)
                        {
                            action.ErrorCategorizer = (IErrorCategorizer)Activator.CreateInstance(retryAttribute.ErrorCategorizer, (object)this._serviceLocator);
                        }
                    }
                    ExtensionsFactory.BuildParameterInfo(methodInfo, action, this._serviceLocator);
                    concurrentDictionary2.TryAdd(action.Name, action);
                }
                catch (Exception ex)
                {
                    this._logger?.Error(ex);
                    throw;
                }
            }
            if (RestWrapper.cache.TryGetValue(interfaceType, out concurrentDictionary1))
            {
                return;
            }
            RestWrapper.cache.TryAdd(interfaceType, concurrentDictionary2);
        }