使用 .NET Core 版本构建的 SignalR 服务器与使用 .NET 框架构建的客户端对话
SingalR server build using .Net Core version talking to client build using .NET framework
我已经设置了一个 .NET Core SignalR 服务器。它使用 Microsoft.AspNetCore.SignalR
和 Microsoft.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 是完全重写的。
请参阅我关于同一件事的回答 ,其中包含更详细的信息。
我已经设置了一个 .NET Core SignalR 服务器。它使用 Microsoft.AspNetCore.SignalR
和 Microsoft.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 是完全重写的。
请参阅我关于同一件事的回答