SignalR连接400错误(错误请求)

时间:2018-01-07 06:08:28

标签: reactjs asp.net-web-api signalr

我正在尝试构建一个SignalR概念证据,其中涉及两个应用程序;一个是Web单页面应用程序,另一个是服务器端RESTful Web API。正在使用的技术/框架是ReactJs,ASP.NET Web API 2(.NET Framework 4.6,非.NET Framework Core)和SignalR。

Web API

这就是我在服务器应用程序中连接SignalR的方法。当应用程序启动时,我将SignalR映射到应用程序管道......

public static void ConfigureSignarlR(IAppBuilder app)
{            
    app.MapSignalR<ChatConnection>("/signalr", new Microsoft.AspNet.SignalR.HubConfiguration
    {
        EnableDetailedErrors = true
    });                
}

ChatConnection类是PersistentConnection的一个实现,没有什么特别之处......

    public class ChatConnection : PersistentConnection
    {
        protected override Task OnReceived(IRequest request, string connectionId, string data)
        {
            return base.OnReceived(request, connectionId, data);
        }

        protected override Task OnConnected(IRequest request, string connectionId)
        {
            return base.OnConnected(request, connectionId);
        }

        public override Task ProcessRequest(HostContext context)
        {
            return base.ProcessRequest(context);
        }
    }

然后我有一个非常简单的中心...

public class ChatHub : Hub
{
    public void Send(string name, string message)
    {
        Clients.All.broadcastMessage(name, message);
    }
}

客户端应用程序

对于客户端应用程序,我正在使用@aspnet/signalr-client npm包...这就是我创建和启动连接的方式......

initialize = () => {
    const hubCon = new HubConnection("http://api.domain/signalr");
    hubCon.start()
           .then(() => console.log("Connection established..."))
           .catch(err => console.log(err))
}

需要注意的事项

  1. API和客户端应用程序都托管在同一本地IIS服务器上,但具有不同的主机名(使用主机文件)

  2. 使用浏览器导航至http://api.domain/signalr/hubs时,在收到消息Protocol error: Unknown transport.

  3. 后的消息时,我收到400(错误请求)回复
  4. 尝试从客户端应用程序连接时,我收到相同的错误消息

  5. 调试ProcessRequest类时,ChatConnection方法是唯一被点击的方法

  6. 问题(S)

    我在这里想念的是什么?或者我怎样才能使这个PoC工作?

    这个问题非常广泛,因为我真的不知道这里发生了什么

1 个答案:

答案 0 :(得分:0)

经过一些挖掘和阅读SignalR文档后,我意识到我做错了什么。基本上,SignalR实现了两种不同的连接模式:

  • 集线器:基于持久连接API构建的高级API
  • 持久连接

客户端无法使用集线器代理与持久连接端点通信(或者至少不是我这样做的方式)。所以,我做的是:

  1. 保留PersistentConnection但覆盖OnReceived方法,以便它可以向所有客户端进行广播

    protected override async Task OnReceived(IRequest request, string connectionId, string data)
    {
        await Connection.BroadCast("message to broadcast");
    }
    
  2. 删除了&#34; signalr \ hubs&#34;脚本参考,因为它不需要

  3. 在启动时注册连接(服务器端)

    app.MapSignalR<ChatConnection>("/chat");

  4. Finnaly,在客户端,初始化连接并注册所有必要的回调

    this.connection = window.$.connection(process.env.REACT_APP_API_BASE_URI + "/chat");
    this.connection.logging = true;
    
    this.connection.received((data) => {
        console.log("Received some data:")
        console.log(data)
    });
    
    
    this.connection.start(() => {
        console.log("Connection opened")
        console.log("connectionId = " + this.connection.id)
    });