SignalR 2.0 Serverside方法不会被触发

时间:2013-10-23 14:58:52

标签: javascript jquery asp.net signalr

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

  

XML-parseError:找不到元素位置:moz-nullprincipal:{b526d81f-4593-4eac-b81d-ebc4a3ef6a39} Rownumber 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函数的工作方式与预期的一样;响应是Pong

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

2 个答案:

答案 0 :(得分:0)

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

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

可以重写为

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

意味着您没有进行跨域SignalR,您恰好通过完整路径包含了hubs文件。

答案 1 :(得分:0)

您的“连接”方法是服务器调用客户端。如果要从客户端调用服务器代码,请尝试使用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) {

      }
    }
});