我正在尝试使用 SignalR 将状态更新分发到侦听客户端。 但是,我的客户端在尝试启动连接时失败并显示"404 未找到"。
我使用 https://learn.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalr-and-mvc 作为起点,尽管我想要一个 C# 客户端而不是脚本网页。
我已经完成了中心的以下步骤:
- AspNet Web 应用程序 (.Net Framework 4.5.2( 添加到解决方案
- 添加了 SignalR 集线器类
- 欧文启动班增加
- 在 IIS 下创建的应用程序 虚拟路径/我的服务 .Net CLR 版本 4.0 集成托管管道 服务帐户标识
- 使用连接代码创建的客户端,如下所示
在大多数情况下,我的测试围绕着使用各种不同的URL尝试两种不同的连接类(连接和HubConnection(。
服务器端使用集线器和 Microsoft.AspNet.SignalR 版本 2.4.1 库
using Microsoft.AspNet.SignalR;
namespace MyService
{
public class JobStatusHub : Hub
{
public void Send(string name, string message)
{
Clients.All.broadcastMessage(name, message);
}
}
}
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(MyService.Startup))]
namespace MyService
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
}
将有两种类型的客户端:消息提供程序和消息使用者。 到目前为止,我只使用Microsoft.AspNet.SignalR.Client版本2.4.1处理包含以下代码的消息源
var connection = new Connection("http://localhost/MyService/signalr/");
connection.Credentials = CredentialCache.DefaultCredentials;
connection.Start().Wait();
而且
var connection = new HubConnection("http://localhost/MyService/signalr");
connection.Credentials = CredentialCache.DefaultCredentials;
connection.Start().Wait();
我尝试了各种连接字符串
有趣的是:当我尝试使用
var connection = new Connection("http://localhost/MyCoreService/myHub");
connection.Credentials = CredentialCache.DefaultCredentials;
connection.Start().Wait();
客户端在抛出时似乎走得更远
状态代码:405,原因短语:"方法不允许">
有没有人对如何解决此"404未找到"错误有任何建议? 还是我没有使用 CORE 服务和集线器犯了错误(当我查找"不允许的方法"错误时,结果表明我无法将框架 2.4.1 客户端与 CORE 集线器一起使用(?
在建立连接之前,必须创建 HubConnection 对象并创建代理。
否则,您的客户不会知道您的 JobStatusHub。
var hubConnection = new HubConnection("http://localhost/MyService/signalr/");
IHubProxy proxy = hubConnection.CreateHubProxy("JobStatusHub");
await hubConnection.Start();
旁注:使用.Wait();
是一种不好的做法。最好使用 GetAwaiter().GetResult();
,因为这可以避免在使用 Wait()
或 Result
时发生的AggregateException
包装。
好吧,这不是一个解决方案,但我最终确实让事情开始了。 首先,我扔掉了我的项目,重新开始,这次使用 https://learn.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalr 和 信号R 控制台应用示例
作为我的起点。 中心看起来大致相同,但客户端已更改为如下所示
private static async void SendMsg ()
{
var hub = new HubConnection("http://localhost:6692");
var proxy = hub.CreateHubProxy("ChatHub");
await hub.Start().ContinueWith(task =>
{
if (task.IsFaulted)
Console.WriteLine($"Failed to connect due to task.Exception.GetBaseException()}");
else
Console.WriteLine($"Connected: {task.Status}");
});
await proxy.Invoke<string>("Send", "Console", "Testing");
Console.WriteLine("SendMsg finished");
}
我的下一个工作是将这个非常简单的PoC代码转换为更实用的东西,作为我的解决方案的一部分。