SignalR 2.0 服务器端方法不会被触发

SignalR 2.0 Serverside methods wont get fired

本文关键字:方法 服务器端 SignalR      更新时间:2023-09-26

我试图实现一些简单的SignalR功能。我查找了一些教程,并能够在合理的时间内从服务器触发javascript代码。然而,反过来,似乎对我不起作用。每当我尝试从 javascript 调用服务器方法时,客户端方法都会触发,向服务器发送请求,但服务器端没有任何反应。该请求具有正常的 200 状态代码,但使用 firebug 我得到了以下 xml 返回:

XML-parseError: 未找到元素 位置: moz-nullprincipal:{b526d81f-4593-4eac-b81d-ebc4a3ef6a39} 行号 1, Coll 1:^

我不知道这是否与此有关,但这是我得到的唯一反馈。

中心:

namespace MusicSharing
{
public class PlayerHub : Hub
{
    public string Connect(string userName)
    {
        var test = userName;
        return userName;
    }
}
}

添加脚本引用:

<script type="text/JavaScript" src="Scripts/jquery-2.0.3.min.js"></script> 
<script type="text/javascript" src="Scripts/jquery.signalR-2.0.0.min.js"></script>
<script src="http://localhost:50287/signalr/hubs"></script>

javascript:

    var chat = $.connection.playerHub;
    $.connection.hub.start().done(function () {
        chat.server.connect("testing");
    });

启动:

using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(MusicSharing.Startup))]
namespace MusicSharing
{
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapSignalR();
    }
}
}

这基本上是我关于 SignalR 的所有代码。我错过了什么还是..?

编辑:ping函数按预期工作;回应是乒乓球

编辑2:onConnect也会被触发,所以它在连接中没有任何内容。它似乎不想触发自定义方法。

您看到的问题不是由于 SignalR 造成的。 SignalR 与 XML 没有任何关联(它只使用 JSON)。 此外,您的代码看起来很准确,但有一个假设:

<script src="http://localhost:50287/signalr/hubs"></script>

可以重写为

<script src="/signalr/hubs"></script>

这意味着您没有执行跨域 SignalR,您只是碰巧通过完整路径包含集线器文件。

您的"连接"方法是让服务器调用客户端。如果要从客户端调用服务器代码,请尝试使用 ajax。下面是调用 MVC 控制器方法的高级示例

public class PlayerHub : Hub
{
    //This server method would be called from another class or controller
    //In turn it will call the client 
    public string Connect(string userName)
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<JobInfoHub>();            
        context.Clients.All.doSomething();
    }
}
var chat = $.connection.playerHub;
$.connection.hub.start();
//This is called from your hub
chat.client.doSomething= function (userName) {
    alert(userName);
    callServerMethod();
};
function callServerMethod() {
$.ajax({
    url: '../Controller/Method',
    type: 'GET',
    global: false,
    datatype: 'json',
    success: function (data) {
      }
    }
});
相关文章: