public virtual async Task InvokeAsync() { try { _diagnosticSource.BeforeAction( _actionContext.ActionDescriptor, _actionContext.HttpContext, _actionContext.RouteData); using (_logger.ActionScope(_actionContext.ActionDescriptor)) { _logger.ExecutingAction(_actionContext.ActionDescriptor); var startTimestamp = _logger.IsEnabled(LogLevel.Information) ? Stopwatch.GetTimestamp() : 0; try { await InvokeFilterPipelineAsync(); } finally { ReleaseResources(); _logger.ExecutedAction(_actionContext.ActionDescriptor, startTimestamp); } } } finally { _diagnosticSource.AfterAction( _actionContext.ActionDescriptor, _actionContext.HttpContext, _actionContext.RouteData); } }
private async Task InvokeActionAsync(HttpContext httpContext, ActionDescriptor actionDescriptor) { var routeData = httpContext.GetRouteData(); try { _diagnosticSource.BeforeAction(actionDescriptor, httpContext, routeData); using (_logger.ActionScope(actionDescriptor)) { _logger.ExecutingAction(actionDescriptor); var startTimestamp = _logger.IsEnabled(LogLevel.Information) ? Stopwatch.GetTimestamp() : 0; var actionContext = new ActionContext(httpContext, routeData, actionDescriptor); if (_actionContextAccessor != null) { _actionContextAccessor.ActionContext = actionContext; } var invoker = _actionInvokerFactory.CreateInvoker(actionContext); if (invoker == null) { throw new InvalidOperationException( Resources.FormatActionInvokerFactory_CouldNotCreateInvoker( actionDescriptor.DisplayName)); } await invoker.InvokeAsync(); _logger.ExecutedAction(actionDescriptor, startTimestamp); } } finally { _diagnosticSource.AfterAction(actionDescriptor, httpContext, routeData); } }
public async Task RouteAsync(RouteContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } var services = context.HttpContext.RequestServices; // Verify if AddMvc was done before calling UseMvc // We use the MvcMarkerService to make sure if all the services were added. MvcServicesHelper.ThrowIfMvcNotRegistered(services); EnsureServices(context.HttpContext); var actionDescriptor = await _actionSelector.SelectAsync(context); if (actionDescriptor == null) { _logger.NoActionsMatched(); return; } // Replacing the route data allows any code running here to dirty the route values or data-tokens // without affecting something upstream. var oldRouteData = context.RouteData; var newRouteData = new RouteData(oldRouteData); if (actionDescriptor.RouteValueDefaults != null) { foreach (var kvp in actionDescriptor.RouteValueDefaults) { if (!newRouteData.Values.ContainsKey(kvp.Key)) { newRouteData.Values.Add(kvp.Key, kvp.Value); } } } // Removing RouteGroup from RouteValues to simulate the result of conventional routing newRouteData.Values.Remove(AttributeRouting.RouteGroupKey); try { context.RouteData = newRouteData; _diagnosticSource.BeforeAction(actionDescriptor, context.HttpContext, context.RouteData); using (_logger.ActionScope(actionDescriptor)) { _logger.ExecutingAction(actionDescriptor); var startTime = Environment.TickCount; await InvokeActionAsync(context, actionDescriptor); context.IsHandled = true; _logger.ExecutedAction(actionDescriptor, startTime); } } finally { _diagnosticSource.AfterAction(actionDescriptor, context.HttpContext, context.RouteData); if (!context.IsHandled) { context.RouteData = oldRouteData; } } }