我有一个使用 ASPNet Core SignalR 集线器 (GameServer) 的游戏服务器和一个使用 ASPNet Core SignalR Client 库 (GameClient) 的客户端。我已经成功地在两者之间建立了联系并传递了一些消息。
中间还有一个类库来抽象出一些服务器和客户端都将使用的东西(GameInteraction)。 GameInteraction 是一个 .Net 标准库(我使用 Unity3d 作为客户端,因此该库需要在 .Net 标准中)。
在 GameInteraction 中,我为 Microsoft.AspNetCore.SignalR.Client.HubConnection 添加了一些扩展方法,如下所示。我在 GameClient 中使用这些方法能够调用一些 GameServer 函数,而不必确保客户端知道要调用哪些方法。
public static async Task<string> CreateGame(this HubConnection connection)
{
var gameId = await connection.InvokeAsync<string>(nameof(IServer.CreateGame));
return gameId;
}
public static async Task JoinGame(this HubConnection connection, string playerName, string gameId)
{
await connection.InvokeAsync(nameof(IServer.JoinGame), playerName, gameId);
}
现在,每当 GameClient 尝试建立与服务器的连接时,我都会收到以下错误。
Microsoft.AspNetCore.Server.Kestrel[0]
The connection listener failed to accept any new connections.
System.MissingMethodException: Method not found: 'Microsoft.AspNetCore.Http.Features.IFeatureCollection Microsoft.AspNetCore.Connections.ConnectionContext.get_Features()'.
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.KestrelConnection..ctor(Int64 id, ServiceContext serviceContext, ConnectionDelegate connectionDelegate, ConnectionContext connectionContext, IKestrelTrace logger)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.ConnectionDispatcher.<>c__DisplayClass8_0.<<StartAcceptingConnectionsCore>g__AcceptConnectionsAsync|0>d.MoveNext()
我有一种感觉,这是因为我使用的 SignalR 库之间存在一些不匹配,即使我对所有三个项目都使用了 ASPNet Core 版本。请注意,如果我删除了扩展方法,但没有从 GameInteraction 中删除 SignalR.Client 库,则连接仍然无法建立。只有当我完全从 GameInteraction 中删除库时,事情才会再次起作用。
有人可以推动我寻求解决方案吗?提前致谢。
回答1
在服务器项目中使用“.NET Core 3.1”作为目标框架但安装 Microsoft.AspNetCore.SignalR.Client 的最新 6.0.x 版本时,我得到了 MissingMethodException ConnectionContext.get_Features()。
目标框架和SignalR client的版本号需要对应,所以我通过将NuGet包管理器中的SignalR.Client包更新为3.1.25解决了这个问题
回答2
我发现了问题所在。我的服务器和 .Net Core 客户端在 .Net Core 3.1 上运行。 GameInteraction 库在 .Net Standard 2.1 上运行。
将服务器和客户端上的目标框架从 .Net core 3.1 更改为 .Net 6.0 解决了该问题。