The list of component records is not valid
发现一份于2019年12月关闭的关于这个问题的错误报告: https://github.com/dotnet/aspnetcore/issues/14966
![enter image description here](https://istack.dev59.com/jRrhS.webp)
有人有什么想法/提示可能是什么引起了这个错误吗?
谢谢!
The list of component records is not valid
当我把我的应用程序从.NET Core 3.0升级到.NET Core 3.1并使用Blazor Client时,我遇到了同样的问题。我发现的第一个“解决办法”是在客户端(web浏览器)上进行强制刷新,也就是说,我按下了Ctrl+F5进行了刷新。
我认为有一些API调用被缓存在客户端上,由于从3.0到3.1的某些版本/格式更改,旧的缓存数据不再有效,从而导致错误。
我将联系在Blazor上工作的人,尝试获取更多信息(我在微软与他们一起工作)。
2020年6月1日更新
我在Azure App Services上运行我的应用程序时再次遇到了这个问题。这一次即使按下Ctrl+F5也没有起作用。但是我找到了https://dev59.com/Gbjna4cB1Zd3GeqP4x8T#59356356,并应用了那里的修复方法,似乎解决了我的问题。
我对代码进行了轻微的更改,因为在我的情况下,我只在暂存/生产中使用Azure SignalR服务而不是开发中。因此,我在应用程序的Startup.cs ConfigureServices
方法中添加了这段代码:
if (!HostingEnvironment.IsDevelopment())
{
services.AddSignalR().AddAzureSignalR(options =>
{
options.ServerStickyMode = Microsoft.Azure.SignalR.ServerStickyMode.Required;
});
}
这个问题可能是由于浏览器的自动缓存控制引起的。
假设您有两个带有Blazor组件的MVC视图:页面A.cshtml和B.cshtml。
当请求页面A时,您会收到一个包含渲染的Blazor组件的HTML响应,并建立一个连接。然后,您导航到页面B。如果您返回到页面A(例如按下返回按钮),则浏览器将使用之前生成的缓存响应来获取页面A。
这应该会中断客户端和服务器之间的连接,因为组件描述符可能会被更改。(有时似乎是随机的。)
要解决此问题,请在您的_Host.cshtml上禁用此缓存行为,添加以下内容:
@{
Context.Response.Headers["Cache-Control"] = "no-store";
}
public class User
{
public User(ClaimsPrincipal principal)
{
....
}
....
}
public class User
{
//this fix
public User(){}
public User(ClaimsPrincipal principal)
{
....
}
....
}
[CascadingParameter]
private User User { get; set; }
@await Html.PartialAsync("_jsBundles")
@RenderBody()
之后),以解决此问题。希望这能为遇到相同错误的其他人节省调试时间。@Eilon 是正确的,如果你打算在 Azure 中使用 SignalR 服务,那么代码片段必须添加到启动配置方法中。
if (!HostingEnvironment.IsDevelopment())
{
services.AddSignalR().AddAzureSignalR(options =>
{
options.ServerStickyMode = Microsoft.Azure.SignalR.ServerStickyMode.Required;
});
}
我已经解决了这个问题(基本上是通过对比最后一个好的 git 复制品和第一个有问题的复制品进行差异处理)。要在 Blazor 中处理身份验证,您需要在 .cshtml 启动文件中获取 XREF 令牌并保存以在适当的 .razor 页面中使用。
如果您遵循任何示例,您将得到以下类来传递此信息:
public class TokenProvider
{
public string? XsrfToken { get; set; }
public string? Cookie { get; set; }
}
public class InitialApplicationState
{
public string? XsrfToken { get; set; }
public string? Cookie { get; set; }
}
以上工作良好。 如果您将InitialApplicationState中的属性标记为必需,则不良工作并且会出现此错误,如下所示:
public class TokenProvider
{
public string? XsrfToken { get; set; }
public string? Cookie { get; set; }
}
public class InitialApplicationState
{
public required string XsrfToken { get; set; }
public required string Cookie { get; set; }
}
为什么?我不知道。但这样可以解决问题。