Min*_*ipe 4 c# asp.net-core razor-pages
我修改了默认值Error.cshtml.cs以在抛出错误时进行记录,并且它工作了一段时间。现在更新到 .NET Core 3.0 版本后它不再工作。
这是我的错误模型:
\n\n[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]\npublic class ErrorModel : PageModel\n{\n public string RequestId { get; set; }\n\n public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);\n\n public IActionResult OnGet()\n {\n RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;\n\n var exceptionHandlerPathFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();\n\n try\n {\n Logger.LogMessage(new LogMessage\n {\n RequestId = RequestId,\n Exception = exceptionHandlerPathFeature?.Error,\n Time = DateTime.Now\n });\n }\n catch (Exception)\n {\n // ignored\n }\n\n return Page();\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这是我的错误 cshtml:
\n\n@page "/Error"\n@model ErrorModel\n@{\n ViewData["Title"] = "Error";\n}\n<h2 class="text-danger">Ein Fehler ist aufgetreten.</h2>\n\n@if (Model.ShowRequestId)\n{\n <p>\n <strong>Anfrage ID:</strong> <code>@Model.RequestId</code>\n </p>\n}\n\n<h3>Hoppla, das sollte nicht passieren</h3>\n<p>\n Bitte merken Sie sich doch den Ablauf der zu diesem Fehler f\xc3\xbchrte und melden Sie ihn dem \n verantwortlichen Entwickler somit er behoben werden kann. Bitte f\xc3\xbcgen Sie auch mindestens die ersten 8 Zeichen der Anfrage ID an\n</p>\nRun Code Online (Sandbox Code Playgroud)\n\n供参考的是我的 Startup 类中的配置方法
\n\n@page "/Error"\n@model ErrorModel\n@{\n ViewData["Title"] = "Error";\n}\n<h2 class="text-danger">Ein Fehler ist aufgetreten.</h2>\n\n@if (Model.ShowRequestId)\n{\n <p>\n <strong>Anfrage ID:</strong> <code>@Model.RequestId</code>\n </p>\n}\n\n<h3>Hoppla, das sollte nicht passieren</h3>\n<p>\n Bitte merken Sie sich doch den Ablauf der zu diesem Fehler f\xc3\xbchrte und melden Sie ihn dem \n verantwortlichen Entwickler somit er behoben werden kann. Bitte f\xc3\xbcgen Sie auch mindestens die ersten 8 Zeichen der Anfrage ID an\n</p>\nRun Code Online (Sandbox Code Playgroud)\n\n问题是 myShowRequestId总是 false,这意味着 myRequestId为 null 或为空。我在 OnGet 方法中放置了一个断点,并确认它没有被执行。
我还尝试使用中间件来记录我的异常,但这也不起作用。
\n\n有人知道这可能是什么原因造成的吗?
\n有两个原因导致app.UseExceptionHandler("/Error")许多错误停止工作。
ErrorExceptionHandler可以通过GET方法或方法调用页面POST,当您向服务器发出请求并发生异常POST时,方法将被调用。POST
当POST从 ExceptionHandler 调用方法时,Error如果不添加[IgnoreAntiforgeryToken]to ,它就无法到达页面PageModel。
所以你必须添加OnPost方法和属性[IgnoreAntiforgeryToken]。
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
[IgnoreAntiforgeryToken]
public class ErrorModel : PageModel
{
...
public ActionResult OnGet()
{
HandleError();
return Page();
}
public ActionResult OnPost()
{
HandleError();
return Page();
}
private void HandleError()
{
...
var exceptionHandlerPathFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
....
}
}
Run Code Online (Sandbox Code Playgroud)
好好享受!
| 归档时间: |
|
| 查看次数: |
3693 次 |
| 最近记录: |