Blazor:组件记录列表无效

bae*_*999 5 blazor

使用 Blazor dotnet core 3.1 并收到此错误:

The list of component records is not valid
Run Code Online (Sandbox Code Playgroud)

发现关于此的错误报告已于 2019 年 12 月关闭:https : //github.com/dotnet/aspnetcore/issues/14966 在此处输入图片说明 看不到此错误的任何原因,并希望有一种解决方法(不能在每个页面调用时都出现此错误,这种情况很少发生......)。

有没有人有可能导致这种情况的想法/提示?

谢谢!

Eil*_*lon 5

在使用 Blazor 客户端将应用程序从 .NET Core 3.0 升级到 .NET Core 3.1 时,我遇到了同样的问题。我发现的第一个“修复”是在客户端(Web 浏览器)上进行强制刷新。也就是说,我按Ctrl+F5刷新。

我假设客户端上缓存了一些 API 调用,并且由于某些版本/格式从 3.0 更改为 3.1,旧的缓存数据不再有效,从而导致错误。

我将联系在 Blazor 工作的人员以尝试获取更多信息(我在 Microsoft 与他们一起工作)。


2020 年 6 月 1 日更新

我再次在 Azure 应用服务上运行我的应用程序。这次甚至Ctrl+ 都F5没有用。但是我找到了/sf/answers/4154944951/,并在那里应用了修复程序,这似乎解决了我的问题。

我对代码进行了轻微更改,因为在我的情况下,我仅在暂存/生产中而不是在开发中使用 Azure SignalR 服务。所以我在我的应用程序的 Startup.csConfigureServices方法中有这个代码:

if (!HostingEnvironment.IsDevelopment())
{
    services.AddSignalR().AddAzureSignalR(options =>
    {
        options.ServerStickyMode = Microsoft.Azure.SignalR.ServerStickyMode.Required;
    });
}
Run Code Online (Sandbox Code Playgroud)


小智 5

就我而言,它是我用作级联值的类,但它没有不带参数的构造函数

public class User 
{
            
    public User(ClaimsPrincipal principal) 
    {
       ....
    }
       ....
 }

 public class User 
 {
    //this fix
    public User(){}
    public User(ClaimsPrincipal principal) 
    {
       ....
    }
       ....
 }

[CascadingParameter]
private User User { get; set; }
Run Code Online (Sandbox Code Playgroud)


Vag*_*Gon 5

此问题可能是由浏览器的自动缓存控制造成的。

假设您有两个包含 Blazor 组件的 MVC 视图:页面 A.cshtml 和 B.cshtml。

请求页面 A 时,您会收到一个 html 响应,其中呈现了 Blazor 组件并建立了连接。然后,您导航到页面 B。如果您返回页面 A(例如按后退按钮),您的浏览器将使用之前缓存的响应来获取页面 A。

这应该会中断客户端和服务器之间的连接,因为组件描述符可能会更改。(有时似乎是随机的)。

要解决此问题,请在 _Host.cshtml 上添加以下内容禁用此缓存行为:

@{ 
    Context.Response.Headers["Cache-Control"] = "no-store";
}
Run Code Online (Sandbox Code Playgroud)

这将阻止浏览器进行缓存,并使其请求具有正确组件描述符的新页面。

参考文献: https://github.com/dotnet/aspnetcore/issues/26174#issuecomment-705472525 https://github.com/dotnet/aspnetcore/issues/18143#issuecomment-585961784

  • 我不得不使用“HttpContext”而不仅仅是“Context”,但乍一看它并没有解决我这边的问题。它仅在清除浏览器(缓存)中的站点数据后才执行,也许是添加到解决方案的一个好注释 (2认同)