我已经和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");
});
我已经挖了一段时间了,但我找不到问题的根源......有人可以帮帮我吗?
答案 0 :(得分:4)
前言:我在edobry的团队参与这个项目,而且我是后端人员,所以这次进入前端对我来说是新的和迷人的。
因此,在我逐步完成项目后仔细剖析代码后,事实证明请求变量中的POST数据是空的。数据被正确发送到$ .ajax调用,但从未到达服务器。还有一些狩猎,我发现了一些可疑的东西,然后我就能看出发生了什么。
我们在页面的其他部分使用Ajax,并且多次调用ajax方法,因此我们将每个方法调用中设置的一些设置考虑到$ .ajaxSetup中。其中一个是dataType设置为“text”,contentType设置为“application / json”。似乎signalR没有正确覆盖全局ajax设置。我不确定这是一个错误还是预期的行为,但是如果是这样的话应该更好地记录(如果是的话,请随意给我们打电话。)。)
答案 1 :(得分:1)
您的方法名为 RegisterSource ,您在javascript中调用 registerSources 而不是 registerSource 。