model-view-controller - 在自定义中间件中访问 TempData

标签 model-view-controller asp.net-core tempdata asp.net-core-middleware

我有提供全局错误处理的自定义中间件。如果捕获到异常,则应使用引用号记录详细信息。然后我想将用户重定向到错误页面并且只显示引用号。我的研究表明 TempData 应该是理想的,但它似乎只能从 Controller 上下文中访问。我尝试将引用号添加到 HttpContext.Items["ReferenceNumber"] = Guid.NewGuid(); 但是这个值会通过重定向丢失。

中间件如何通过重定向传递信息?我只需要将数字放在查询字符串中吗?

最佳答案

在中间件类中,您需要添加一个引用才能访问所需的接口(interface)。我在一个单独的项目中有这个中间件,需要添加这个 NuGet 包。

using Microsoft.AspNetCore.Mvc.ViewFeatures;

这允许您在中间件中请求正确的服务。

//get TempData handle
ITempDataDictionaryFactory factory = httpContext.RequestServices.GetService(typeof(ITempDataDictionaryFactory)) as ITempDataDictionaryFactory;
ITempDataDictionary tempData = factory.GetTempData(httpContext);

拥有 ITempDataDictionary 后,您可以像在 Controller 中使用 TempData 一样使用它。

//pass reference number to error controller
Guid ReferenceNum = Guid.NewGuid();
tempData["ReferenceNumber"] = ReferenceNum.ToString();

//log error details
logger.LogError(eventID, exception, ReferenceNum.ToString() + " - " + exception.Message);

现在,当我在重定向后获得 Controller 时,我可以毫无问题地提取引用号并在我的 View 中使用它。

//read value in controller
string refNum = TempData["ReferenceNumber"] as string;
if (!string.IsNullOrEmpty(refNum))
    ViewBag.ReferenceNumber = refNum;

@*display reference number if one was provided*@
@if (ViewBag.ReferenceNumber != null){<p>Reference Number: @ViewBag.ReferenceNumber</p>}

将所有这些放在一起后,您就可以为用户提供一个引用号,他们可以提供给您以帮助解决问题。但是,您不会传回可能被滥用的潜在敏感错误信息。

关于model-view-controller - 在自定义中间件中访问 TempData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45330103/

相关文章:

C# ASP.NET TempData 正在运行,但现在它不在 3 台计算机中的 2 台上

asp.net - 在nodejs中模拟ASP.NET TempData

unit-testing - Wicket/MVC 架构/测试问题

java - Spring MVC 缺少 URI 模板变量

c# - 如何从 url 中删除 Controller 和操作,只获取 MVC 中的 url

c# - 对 ASP.NET Core 中缺少必需属性的响应

c# - 如何从 Asp.Net Core View 组件返回错误的 HTTP 状态代码

docker - System.Net.Http.HttpRequestException : Connection refused

c# TempData 等效于 php

java - 如何使用 MVC 在 CardLayout 中的 JPanel 之间切换?