无法刷新 Hangfire 仪表板中的统计信息

问题描述:

我的网站在同一台服务器上使用 hangfire 运行.

My website running with hangfire on the same server.

hangfire 仪表板在本地运行良好.但是,当我在服务器计算机*问 http://localhost/hangfire/recurring 时,它报告此错误:

The hangfire dashboard runs well on local. However, while I access http://localhost/hangfire/recurring on the server computer, it reports this error:

Unable to refresh the statistics: the server responded with 500 (Internal Server Error). Try reloading the page manually, or wait for automatic reload that will happen in a minute.

我在 Chrome DevTools 上发现了问题:http://localhost/hangfire/stats 返回 500(内部服务器错误).

I found out the problem on Chrome DevTools: The http://localhost/hangfire/stats returns a 500 (Internal Server Error).

很快我就找到了关于这个的日志:

Soon I found the logs about this:

2021-05-29 15:35:55.6185|7|ERROR|Microsoft.AspNetCore.Antiforgery.DefaultAntiforgery|An exception was thrown while deserializing the token. Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: The antiforgery token could not be decrypted.
 ---> System.Security.Cryptography.CryptographicException: The key {a2487e3b-0ba1-4f7f-9679-8721bb79278e} was not found in the key ring.
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus& status)
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte[] protectedData, Boolean ignoreRevocationErrors, Boolean& requiresMigration, Boolean& wasRevoked)
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect(Byte[] protectedData)
   at Microsoft.AspNetCore.Antiforgery.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)
   --- End of inner exception stack trace ---
   at Microsoft.AspNetCore.Antiforgery.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)
   at Microsoft.AspNetCore.Antiforgery.DefaultAntiforgery.GetCookieTokenDoesNotThrow(HttpContext httpContext)
2021-05-29 15:35:55.6185|1|ERROR|Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware|An unhandled exception has occurred while executing the request. System.ArgumentNullException: The required antiforgery cookie token must be provided. (Parameter 'cookieToken')
   at Microsoft.AspNetCore.Antiforgery.DefaultAntiforgeryTokenGenerator.TryValidateTokenSet(HttpContext httpContext, AntiforgeryToken cookieToken, AntiforgeryToken requestToken, String& message)
   at Microsoft.AspNetCore.Antiforgery.DefaultAntiforgery.IsRequestValidAsync(HttpContext httpContext)
   at Hangfire.Dashboard.AspNetCoreDashboardMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
   at Sample.Middleware.LanguageCheckerMiddleware.Invoke(HttpContext context) in D:SampleMiddlewareLanguageCheckerMiddleware.cs:line 55
   at Sample.Middleware.AdminBlackListMiddleware.Invoke(HttpContext context) in D:SampleMiddlewareAdminBlackListMiddleware.cs:line 69
   at Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)

我在中间件的每个 public async Task Invoke(HttpContext context) 中添加了这些代码,以防止它阻止挂起,但问题仍然存在:

I have added these code in each public async Task Invoke(HttpContext context) of the middleware to prevent it block the hangfire but the problem still here:

if (context.Request.Host.Host.ToLower() == "localhost")
            {
                await _next.Invoke(context);
                return;
            }

我该如何解决这个问题?谢谢.

How can I solve this? Thank you.

在 startup.cs 中添加:

Add this in startup.cs:

app.UseHangfireDashboard("/hangfire", new DashboardOptions
            {
                Authorization = new[] {new HangfireAuthFilter()},
                IgnoreAntiforgeryToken = true                                 // <--This
            });

现在它可以工作了.