客户端找不到 .Net Framework 4.5 下的 SignalR Hub



我正在尝试使用 SignalR 将状态更新分发到侦听客户端。 但是,我的客户端在尝试启动连接时失败并显示"404 未找到"。

我使用 https://learn.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalr-and-mvc 作为起点,尽管我想要一个 C# 客户端而不是脚本网页。

我已经完成了中心的以下步骤:

  1. AspNet Web 应用程序 (.Net Framework 4.5.2( 添加到解决方案
  2. 添加了 SignalR 集线器类
  3. 欧文启动班增加
  4. 在 IIS 下创建的应用程序 虚拟路径/我的服务 .Net CLR 版本 4.0 集成托管管道 服务帐户标识
  5. 使用连接代码创建的客户端,如下所示

在大多数情况下,我的测试围绕着使用各种不同的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代码转换为更实用的东西,作为我的解决方案的一部分。

最新更新