3

几天来我一直在玩 SignalR,我不得不说它绝对是一个了不起的库。我已经设法得到了一些使用它的东西,并且对它的简单性感到震惊,但我最近遇到了一个小问题。

我无法在浏览器中从 JavaScript 调用 Hub 方法。该请求返回一个 500 错误代码,当我查看错误页面源时,我看到:

[ArgumentNullException: Value cannot be null.
Parameter name: s]
System.IO.StringReader..ctor(String s) +10207225
Newtonsoft.Json.Linq.JObject.Parse(String json) +74
SignalR.Hubs.HubRequestParser.Parse(String data) +78
SignalR.Hubs.HubDispatcher.OnReceivedAsync(IRequest request, String connectionId,  String data) +266
SignalR.<>c__DisplayClass6.<ProcessRequestAsync>b__4(String data) +84
SignalR.Transports.ForeverTransport.ProcessSendRequest() +159
SignalR.Transports.ForeverTransport.ProcessRequestCore(ITransportConnection connection)  +149
SignalR.Transports.ForeverTransport.ProcessRequest(ITransportConnection connection) +42
SignalR.PersistentConnection.ProcessRequestAsync(HostContext context) +1087
SignalR.Hubs.HubDispatcher.ProcessRequestAsync(HostContext context) +251
SignalR.Hosting.AspNet.AspNetHandler.ProcessRequestAsync(HttpContextBase context) +656
SignalR.Hosting.AspNet.HttpTaskAsyncHandler.System.Web.IHttpAsyncHandler.BeginProcessReques t(HttpContext context, AsyncCallback cb, Object extraData) +143
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()  +9479007
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&  completedSynchronously) +178

我的服务器端代码是:

public class SourceHub : Hub
{
    public void RegisterSource(string source)
    {
        Groups.Add(Context.ConnectionId, source);
    }
}

在客户端我有:

var SourceHub = $.connection.sourceHub;
$.connection.hub.start().done(function () {
    SourceHub.registerSource("test");
});

我已经挖掘了一段时间,但我就是找不到问题的根源......有人可以帮我吗?

4

2 回答 2

4

前言:我在 edobry 的团队中负责这个项目,我是后端的人,所以这次进军前端对我来说是新的和吸引人的。

因此,在我逐步完成项目时对代码进行了一些仔细的剖析之后,结果发现请求变量中的 POST 数据是空的。数据被正确发送到 $.ajax 调用,但从未到达服务器。又进行了一些狩猎,我发现了一些可疑的东西,然后我就能够辨别出正在发生的事情。

我们将 Ajax 用于页面的其他部分,并且多次调用 ajax 方法,因此我们将在每个方法调用中设置的一些设置分解为 $.ajaxSetup。其中之一是将 dataType 设置为“text”,将 contentType 设置为“application/json”。似乎 signalR 没有正确覆盖全局 ajax 设置。我不确定这是一个错误还是预期的行为,但如果是这种情况,应该更好地记录它(如果是,请随时称我们为愚蠢。:))

于 2012-09-12T18:29:06.743 回答
1

您的方法称为RegisterSource并且您在 javascript 中调用registerSources而不是registerSource 。

于 2012-09-12T09:04:39.817 回答