我试图实现一些简单的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也被触发,因此它在连接中没有任何内容。它似乎并不想激发自定义方法。
答案 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) {
}
}
});