【问题标题】:SignalR Hub under .Net Framework 4.5 not found by client客户端未找到 .Net Framework 4.5 下的 SignalR Hub
【发布时间】:2019-12-14 23:18:10
【问题描述】:

我正在尝试使用 SignalR 将状态更新分发给监听客户端。但是,我的客户端在尝试启动连接时失败并显示“404 Not found”。

我使用https://docs.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. 添加了 Owin 启动类
  4. 在 IIS 下创建的应用程序 虚拟路径 /MyService .Net CLR 4.0 版 集成管理管道 服务帐号身份
  5. 使用如图所示的连接代码创建的客户端

在大多数情况下,我的测试围绕着使用各种不同的 URL 尝试两种不同的连接类(Connection 和 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();

我尝试过各种连接字符串

有趣的是:当我尝试使用

连接到 .Net CORE 集线器时
        var connection = new Connection("http://localhost/MyCoreService/myHub");
        connection.Credentials = CredentialCache.DefaultCredentials;
        connection.Start().Wait();

客户端似乎在抛出时走得更远

StatusCode:405,ReasonPhrase:'方法不允许'

对于什么可以解决这个“404 Not found”错误,有人有什么建议吗?还是我在不使用 CORE 服务和集线器时犯了一个错误(当我查看 Method Not Allowed 错误时,结果显示我无法使用带有 CORE 集线器的 Framework 2.4.1 客户端)?

【问题讨论】:

  • 您不能将 CORE 服务器/客户端与 .NET (2.4.1) 服务器/客户端混合使用,它们彼此不兼容。根据您的需要,这两种方法都是完全可行的。
  • 谢谢@FrankM - 这证实了我在尝试使用 CORE 集线器时对问题的看法(在最后的旁边提到)。当我在客户端和服务器端都使用 Framework 4.5 时,您能否就这里出了什么问题提供任何想法?
  • 出于绝望,我在一些关键调用中尝试随机参数。例如(在多次尝试中)我尝试了 app.MapSignalR("localhost/myServer/jobStatusHub");连同 var connection = new HubConnection("localhost/myServer"); 和 var hubProxy = connection.CreateHubProxy("/jobStatusHub");

标签: c# signalr


【解决方案1】:

在建立连接之前,您必须创建一个 HubConnection 对象创建一个代理。

否则您的客户不知道您的 JobStatusHub。

var hubConnection = new HubConnection("http://localhost/MyService/signalr/");
IHubProxy proxy = hubConnection.CreateHubProxy("JobStatusHub");
await hubConnection.Start();

旁注:使用.Wait();bad practice。首选使用GetAwaiter().GetResult();,因为这样可以避免使用Wait()Result 时发生的AggregateException 包装。

【讨论】:

  • 感谢您的反馈。我使用 URL localhost/MyService/signalrlocalhost/MyService/signalr/hubs 尝试了一个带有 HubProxy 的 HubConnection,但两者都继续给我 404 Not found 错误。是我的服务器端调用 app.MapSignalR();足以识别 jobStatusHub?
  • 只要你的服务器项目的url是“localhost/MyService”,可以。否则你必须提供 MapSignalR 真实的 url 或在客户端调整你的连接 url。
  • 恐怕不高兴。我一直在修改客户端上的新 HubConnection 和 CreateHubProxy 命令以及服务器上的 app.MapSignalR 的参数,但没有任何用处。
  • 您看到了什么消息或错误?您可以将新代码添加到您的帖子中吗?
【解决方案2】:

好的,这不是一个解决方案,但我最终确实让事情正常了。首先我扔掉了我的项目并重新开始,这次使用 https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalrSignalR Console app example

作为我的出发点。集线器看起来很相似,但客户端看起来像

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 代码变成更实用的东西,作为我解决方案的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    相关资源
    最近更新 更多