System.PlatformNotSupportedException 在 .net 5 上使用 mongodb 驱动程序时

System.PlatformNotSupportedException when using mongodb driver on .net 5

我有一个 blazor wasm app,我正在尝试连接到一个 mongodb。一旦我创建 FindAsync 或连接到数据库的东西,我就会得到一个例外,即这个平台不支持。我 google 发现了一些与连接字符串有关的问题,但在我的集成测试中,相同的连接字符串工作正常。 MongoClient 注册为单例,我到处都使用 async await,因为 wasm 似乎不支持 .Result 或任何阻塞调用。我在 mac 和骑手一起发展。我尝试了多种连接数据库的方法,但总是遇到这个神秘的错误。

这是堆栈跟踪:

A timeout occurred after 30000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 }, OperationsCountServerSelector }. Client view of cluster state is { ClusterId : "1", Type : "Unknown", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "157.90.1.251:3513" }", EndPoint: "157.90.1.251:3513", ReasonChanged: "Heartbeat", State: "Disconnected", ServerVersion: , TopologyVersion: , Type: "Unknown", HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server.
blazor.webassembly.js:1 ---> System.PlatformNotSupportedException: System.Net.Sockets is not supported on this platform.
blazor.webassembly.js:1   at System.Net.Sockets.Socket..ctor(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
blazor.webassembly.js:1   at MongoDB.Driver.Core.Connections.TcpStreamFactory.CreateSocket(EndPoint endPoint)
blazor.webassembly.js:1   at MongoDB.Driver.Core.Connections.TcpStreamFactory.CreateStreamAsync(EndPoint endPoint, CancellationToken cancellationToken)
blazor.webassembly.js:1   at MongoDB.Driver.Core.Connections.BinaryConnection.OpenHelperAsync(CancellationToken cancellationToken)
blazor.webassembly.js:1   --- End of inner exception stack trace ---
blazor.webassembly.js:1   at MongoDB.Driver.Core.Connections.BinaryConnection.OpenHelperAsync(CancellationToken cancellationToken)
blazor.webassembly.js:1   at MongoDB.Driver.Core.Servers.ServerMonitor.InitializeConnectionAsync(CancellationToken cancellationToken)
blazor.webassembly.js:1   at MongoDB.Driver.Core.Servers.ServerMonitor.HeartbeatAsync(CancellationToken cancellationToken)", LastHeartbeatTimestamp: "2021-08-18T09:47:41.3960000Z", LastUpdateTimestamp: "2021-08-18T09:47:41.3960000Z" }] }.
blazor.webassembly.js:1   at MongoDB.Driver.Core.Clusters.Cluster.ThrowTimeoutException(IServerSelector selector, ClusterDescription description)
blazor.webassembly.js:1   at MongoDB.Driver.Core.Clusters.Cluster.WaitForDescriptionChangedHelper.HandleCompletedTask(Task completedTask)
blazor.webassembly.js:1   at MongoDB.Driver.Core.Clusters.Cluster.WaitForDescriptionChangedAsync(IServerSelector selector, ClusterDescription description, Task descriptionChangedTask, TimeSpan timeout, CancellationToken cancellationToken)
blazor.webassembly.js:1   at MongoDB.Driver.Core.Clusters.Cluster.SelectServerAsync(IServerSelector selector, CancellationToken cancellationToken)
blazor.webassembly.js:1   at MongoDB.Driver.MongoClient.AreSessionsSupportedAfterServerSelectionAsync(CancellationToken cancellationToken)
blazor.webassembly.js:1   at MongoDB.Driver.MongoClient.AreSessionsSupportedAsync(CancellationToken cancellationToken)
blazor.webassembly.js:1   at MongoDB.Driver.MongoClient.StartImplicitSessionAsync(CancellationToken cancellationToken)
blazor.webassembly.js:1   at MongoDB.Driver.MongoCollectionImpl`1.<UsingImplicitSessionAsync>d__106`1[[FadingFlameLeague.UserAccounts.UserAccount, FadingFlameLeague, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[FadingFlameLeague.UserAccounts.UserAccount, FadingFlameLeague, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext()
blazor.webassembly.js:1   at FadingFlameLeague.Repositories.MongoDbRepositoryBase.<Upsert>d__9`1[[FadingFlameLeague.UserAccounts.UserAccount, FadingFlameLeague, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext() in /Users/simonheiss/IdeaProjects/FadingFlameLeague/FadingFlameLeague/Repositories/MongoDbRepositoryBase.cs:line 63
blazor.webassembly.js:1   at FadingFlameLeague.Pages.Register.OnValidSubmit() in /Users/simonheiss/IdeaProjects/FadingFlameLeague/FadingFlameLeague/Pages/Register.razor:line 55

这就是我生成 MongoClient 的方式

services.AddSingleton(_ =>
        {
            var mongoConnectionString = "mongodb://157.90.1.251:3513";
            return new MongoClient(mongoConnectionString);
        });

类似的事情抛出异常:

private async Task OnValidSubmit()
{
    var mongoDatabase = client.GetDatabase("test");
    var mongoCollection = mongoDatabase.GetCollection<UserAccount>(typeof(UserAccount).Name);
    await mongoCollection.InsertOneAsync(new UserAccount());
}

这真令人沮丧,我已经花了几个小时,但我似乎没有发现任何问题。一些文章提到 wasm 和 .net 标准不能很好地协同工作,并且 mongo 客户端在 .net 标准 2.1 中。但我无法想象这是一个问题,我的意思是我肯定不是第一个一起测试 wasm 和 mongo 的人^^

您看到的错误是您试图在 wasm 运行时打开套接字:

blazor.webassembly.js:1 ---> System.PlatformNotSupportedException: System.Net.Sockets is not supported on this platform.
blazor.webassembly.js:1   at System.Net.Sockets.Socket..ctor(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)

您无法在 Web 浏览器中打开套接字,因此您得到 PlatformNotSupportedException

同样,我认为您无法通过 Web 浏览器直接使用 MongoDB 数据库,除非此类交互是通过 HTTP 或 websocket 完成的。我希望您为此需要一个特殊的库。

从安全的角度来看,我不确定将 Web 客户端直接连接到数据库是否是个好主意。