private ResponseMessage ExecuteMethodErrorHandler(HttpContext context, RpcRequestMessage requestMessage, Exception exp, bool runFilters, List <ICallFilter> filters, CallExecutionContext callExecutionContext) { if (runFilters) { foreach (var callFilter in filters) { ICallExceptionFilter exceptionFilter = callFilter as ICallExceptionFilter; try { exceptionFilter?.HandleException(callExecutionContext, exp); } catch (Exception e) { _logger?.LogError(EventIdCode.ExecutionFilterException, e, "Exception thrown while invoking ICallExceptionFilter"); } } } _logger?.LogError(EventIdCode.ExecutionException, exp, $"Exception thrown while processing {context.Request.Path} {requestMessage.Method} - " + exp.Message); return(ReturnInternalServerError(requestMessage.Version, requestMessage.Id, $"Executing {context.Request.Path} {requestMessage.Method} {exp.Message}")); }
private async Task <ResponseMessage> ExecuteMethod(HttpContext context, IServiceProvider serviceProvider, RpcRequestMessage requestMessage, IExposedMethodInformation exposedMethod) { CallExecutionContext callExecutionContext = new CallExecutionContext(context, exposedMethod.InstanceType, exposedMethod.MethodInfo, requestMessage); if (exposedMethod.MethodAuthorizations.Length > 0) { for (var i = 0; i < exposedMethod.MethodAuthorizations.Length; i++) { if (!await exposedMethod.MethodAuthorizations[i].AsyncAuthorize(callExecutionContext)) { if (_debugLogging) { _logger?.LogDebug($"Unauthorized access to {context.Request.Path} {requestMessage.Method}"); } return(ReturnUnauthorizedAccess(context, requestMessage.Version, requestMessage.Id)); } } } object newInstance = null; try { newInstance = exposedMethod.InstanceProvider(context, serviceProvider); callExecutionContext.Instance = newInstance; } catch (Exception exp) { _logger?.LogError(EventIdCode.ActivationException, exp, $"Exception thrown while creating instance {exposedMethod.InstanceType.Name} for {context.Request.Path} {requestMessage.Method} - " + exp.Message); // log error return(ReturnInternalServerError(requestMessage.Version, requestMessage.Id, $" Could not activate type {exposedMethod.InstanceType.FullName}\n{exp.Message}")); } if (newInstance == null) { return(ReturnInternalServerError(requestMessage.Version, requestMessage.Id, $"Could not locate type {exposedMethod.InstanceType.FullName}")); } List <ICallFilter> filters = null; bool runFilters = false; var exposedFilters = exposedMethod.Filters; if (exposedFilters.Length > 0) { filters = new List <ICallFilter>(); try { for (var i = 0; i < exposedFilters.Length; i++) { filters.AddRange(exposedFilters[i](callExecutionContext)); } } catch (Exception exp) { _logger?.LogError(EventIdCode.ActivationException, exp, $"Exception thrown while activating filters for {exposedMethod.InstanceType.Name} {context.Request.Path} {requestMessage.Method} - " + exp.Message); return(ReturnInternalServerError(requestMessage.Version, requestMessage.Id, "Could not activate filters")); } runFilters = filters.Count > 0; } try { object[] parameterValues = requestMessage.Parameters ?? NoParamsArray; if (runFilters) { callExecutionContext.Parameters = parameterValues; for (var i = 0; i < filters.Count; i++) { if (callExecutionContext.ContinueCall && filters[i] is ICallExecuteFilter executeFilter) { executeFilter.BeforeExecute(callExecutionContext); } } parameterValues = callExecutionContext.Parameters; } ResponseMessage responseMessage; if (callExecutionContext.ContinueCall) { responseMessage = await exposedMethod.InvokeMethod(newInstance, parameterValues, requestMessage.Version, requestMessage.Id); } else { return(callExecutionContext.ResponseMessage); } if (runFilters && callExecutionContext.ContinueCall) { callExecutionContext.ResponseMessage = responseMessage; for (var i = 0; i < filters.Count; i++) { if (callExecutionContext.ContinueCall && filters[i] is ICallExecuteFilter executeFilter) { executeFilter.AfterExecute(callExecutionContext); } } return(callExecutionContext.ResponseMessage); } return(responseMessage); } catch (Exception exp) { return(ExecuteMethodErrorHandler(context, requestMessage, exp, runFilters, filters, callExecutionContext)); } }