使用 .NET Core 版本构建的 SignalR 服务器与使用 .NET 框架构建的客户端对话

SingalR server build using .Net Core version talking to client build using .NET framework

我已经设置了一个 .NET Core SignalR 服务器。它使用 Microsoft.AspNetCore.SignalRMicrosoft.AspNetCore.SignalR.Core nuget 包。此应用程序在启动 class 中配置如下。

public class Startup
{
    public IConfiguration Configuration;

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSignalR();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapHub<ChatHub>("/chatHub");
        });
    }
}

ChatHub class 公开了一个 SendThisMessage 方法,如下所示。

public class ChatHub : Hub
{

    public ChatHub() { }

    // Overrides
    public override Task OnConnectedAsync()
    {
        Console.WriteLine($"OnConnectedAsync - {this.Context.ConnectionId}");
        return base.OnConnectedAsync();
    }

    public override Task OnDisconnectedAsync(Exception exp)
    {
        Console.WriteLine($"OnDisconnectedAsync - {this.Context.ConnectionId}");
        return base.OnDisconnectedAsync(exp);
    }

    public async Task SendThisMessage(string userName, string message)
    {
        Console.WriteLine("Hello SendThisMessage");
        await Clients.All.SendAsync("ReceiveMessage", userName, message);
    }
}

我创建了一个简单的 .NET Core 客户端,如下所示,它按预期工作。请注意,它使用 Microsoft.AspNetCore.SignalR.Client nuget 包

static void Main(string[] args)
{
    var connection = new HubConnectionBuilder()
        .WithUrl("http://localhost:5000/chatHub")
        .Build();


    connection.StartAsync().Wait();
    connection.InvokeCoreAsync("SendThisMessage", args: new[] { "hello", "world" });
    connection.On("ReceiveMessage", (string userName, string message) =>
    {
        Console.WriteLine(userName + " ; " + message);
    });
    Console.ReadKey();
} 

不过,我还需要为 .NET Framework 4.6 构建一个类似的客户端。这使用 Microsoft.AspNet.SignalR.Client nuget 包。为此,我从以下代码开始。

static void Main(string[] args)
{
    HubConnection connection = new HubConnection("http://localhost:5000/");
    IHubProxy proxy = connection.CreateHubProxy("chatHub");

    connection.Start().Wait();
    Console.ReadKey();

}

它导致以下异常。

Inner Exception 1: HttpClientException: StatusCode: 404, ReasonPhrase: 'Not Found', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Cache-Control: private Date: Wed, 02 Sep 2020 21:43:50 GMT Server: Microsoft-IIS/10.0 X-Powered-By: ASP.NET
Content-Length: 4935 Content-Type: text/html; charset=utf-8 }

.NET 4.6 客户端是否可以与使用 .NET Core 实现的 SignalR 服务器通信?

简短的回答是否定的,您不能混合使用 .NET 4.x 和 .NET Core。 .NET Core 是完全重写的。

请参阅我关于同一件事的回答 ,其中包含更详细的信息。