Swa*_*odo 3 model-view-controller tempdata asp.net-core asp.net-core-middleware
我有提供全局错误处理的自定义中间件。如果捕获到异常,则应使用参考编号记录详细信息。然后我想将用户重定向到错误页面并只显示参考号。我的研究表明 TempData 应该是理想的,但它似乎只能从控制器上下文中访问。我尝试将参考编号添加到HttpContext.Items["ReferenceNumber"] = Guid.NewGuid();
但此值通过重定向丢失。
中间件如何通过重定向传递信息?我是否只需要将数字放在查询字符串中?
在中间件类中,您需要添加一个引用以访问所需的接口。我在一个单独的项目中有这个中间件,需要添加这个 NuGet 包。
using Microsoft.AspNetCore.Mvc.ViewFeatures;
Run Code Online (Sandbox Code Playgroud)
这允许您在中间件中请求正确的服务。
//get TempData handle
ITempDataDictionaryFactory factory = httpContext.RequestServices.GetService(typeof(ITempDataDictionaryFactory)) as ITempDataDictionaryFactory;
ITempDataDictionary tempData = factory.GetTempData(httpContext);
Run Code Online (Sandbox Code Playgroud)
拥有 ITempDataDictionary 后,您可以像在控制器中使用 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);
Run Code Online (Sandbox Code Playgroud)
现在,当我在重定向后获得控制器时,我没有任何问题可以拉出参考号并在我看来使用它。
//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>}
Run Code Online (Sandbox Code Playgroud)
将所有这些放在一起后,您就可以为用户提供一个参考编号,他们可以为您提供帮助解决问题的参考编号。但是,您不会传回可能被滥用的潜在敏感错误信息。
| 归档时间: |
|
| 查看次数: |
2133 次 |
| 最近记录: |