private static SaveTempDataContext GetTempDataContext(HttpContext httpContext) { SaveTempDataContext saveTempDataContext = null; if (httpContext.Items.TryGetValue(SaveTempDataFilterContextKey, out var value)) { saveTempDataContext = (SaveTempDataContext)value; } return(saveTempDataContext); }
/// <inheritdoc /> public void OnResourceExecuting(ResourceExecutingContext context) { if (!context.HttpContext.Items.ContainsKey(SaveTempDataFilterContextKey)) { var tempDataContext = new SaveTempDataContext() { Filters = context.Filters, TempDataDictionaryFactory = _factory }; context.HttpContext.Items.Add(SaveTempDataFilterContextKey, tempDataContext); } if (!context.HttpContext.Response.HasStarted) { context.HttpContext.Response.OnStarting((state) => { var httpContext = (HttpContext)state; var saveTempDataContext = GetTempDataContext(context.HttpContext); if (saveTempDataContext.RequestHasUnhandledException) { return(Task.CompletedTask); } // If temp data was already saved, skip trying to save again as the calls here would potentially fail // because the session feature might not be available at this point. // Example: An action returns NoContentResult and since NoContentResult does not write anything to // the body of the response, this delegate would get executed way late in the pipeline at which point // the session feature would have been removed. if (saveTempDataContext.TempDataSaved) { return(Task.CompletedTask); } SaveTempData( result: null, factory: saveTempDataContext.TempDataDictionaryFactory, filters: saveTempDataContext.Filters, httpContext: httpContext); return(Task.CompletedTask); }, state: context.HttpContext); } }
/// <inheritdoc /> public void OnResourceExecuting(ResourceExecutingContext context) { if (!context.HttpContext.Items.ContainsKey(SaveTempDataFilterContextKey)) { var tempDataContext = new SaveTempDataContext() { Filters = context.Filters, TempDataDictionaryFactory = _factory }; context.HttpContext.Items.Add(SaveTempDataFilterContextKey, tempDataContext); } if (!context.HttpContext.Response.HasStarted) { context.HttpContext.Response.OnStarting( callback: OnStartingCallback, state: context.HttpContext); } }