Signalr 信号器返回错误-反序列化对象时意外结束

Signalr 信号器返回错误-反序列化对象时意外结束,signalr,signalr-hub,Signalr,Signalr Hub,我有一个简单的项目,我正在使用signalR,当页面加载时,signalR脚本被成功加载,然而在这之后,调用 http://localhost:24634/signalr/signalr/connect?transport=foreverFrame&connectionId=dca2db9c-b16a-4b96-96dc-9a6b187b6d9e&connectionData=[{name:notifier}]&tid=5&frameId=1 返回500个内部服务器错误,我在fiddler中检查

我有一个简单的项目,我正在使用signalR,当页面加载时,signalR脚本被成功加载,然而在这之后,调用

http://localhost:24634/signalr/signalr/connect?transport=foreverFrame&connectionId=dca2db9c-b16a-4b96-96dc-9a6b187b6d9e&connectionData=[{name:notifier}]&tid=5&frameId=1

返回500个内部服务器错误,我在fiddler中检查了此请求,错误消息显示

反序列化对象时出现意外结束

这是我的中心定义

[HubName("notifier")]
    public class PublishingNotifier: Hub
    {   
        [HubMethodName("send")]
        public void SendMessage(string message)
        {
            Clients.getNotification(message);
        }
    }
这是我的客户代码

$(function () {

            var publishingNotifier = $.connection.notifier;

            publishingNotifier.getNotification = function (message) {
                // do something
            };

            $('input[type=submit][id*=cmsB_ChangeStatusToPublishedTop]').on('click', function (e) {
                // do something else
            });

            $.connection.hub.start();
        });
你知道这个错误的原因是什么吗

编辑 下面是堆栈跟踪信息

[JsonSerializationException:反序列化对象时意外结束。 第1行,位置2。] Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CheckedReadJsonReader 读者+75 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObjectJsonReader reader,类型objectType,JsonContract合同,JsonProperty成员, 对象现有值+48 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternalJsonReader reader,类型objectType,JsonContract合同,JsonProperty成员, 对象现有值+86 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateListUppedCollection wrappedList、JsonReader、字符串引用、JsonArrayContract 合同+635 Newtonsoft.Json.Serialization.c_DisplayClass1.b_0IList l、 布尔值isTemporaryListReference+124 Newtonsoft.Json.Utilities.CollectionUtils.CreateAndPopulateListType 列表类型,Action2 populateList+546 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateAndPopulateListJsonReader 读卡器,字符串引用,JsonArrayContract合同+101 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateListJsonReader reader,类型objectType,JsonContract合同,JsonProperty成员, 对象存在值,字符串引用+62 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternalJsonReader reader,类型objectType,JsonContract合同,JsonProperty成员, 对象存在值+113 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueNonPropertyJsonReader reader,类型objectType,JsonContract合同,JsonConverter 转换器+118 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeJsonReader 读卡器,类型objectType+125 Newtonsoft.Json.JsonSerializer.DeserializeInternalJsonReader, 类型objectType+311 Newtonsoft.Json.JsonConvert.DeserializeObjectString值,类型, JsonSerializerSettings设置+107 Newtonsoft.Json.JsonConvert.DeserializeObjectString值, JsonSerializerSettings设置+66 SignalR.JsonNetSerializer.ParseString json+57 SignalR.Hubs.HubDispatcher.CreateConnectionString connectionId, IEnumerable1组,IRequest请求+140 SignalR.PersistentConnection.ProcessRequestAsyncHostContext上下文 +227 signal.Hubs.HubDispatcher.ProcessRequestAsynchHostContext上下文+120 SignalR.Hosting.AspNet.AspNetHandler.ProcessRequestAsyncHttpContextBase 上下文+463 SignalR.Hosting.AspNet.HttpTaskAsyncHandler.System.Web.IHTTPassynchandler.BeginProcessRequestHttpContext 上下文,异步回调cb,对象外部数据+68 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute +301 System.Web.HttpApplication.executesteppexecutionstep步骤,布尔值&同步完成+155

编辑2:

还有一个注意事项-从运行时没有任何错误的页面中,请求的url如下所示

本地主机:24634/signer/signer/connect?传输=永久帧和连接ID=98e6d5b3-b164-4013-92c2-418aa6254f9e和连接数据=%5B%7B%22name%22%3A%22通知程序%22%7D%5D&tid=7和帧ID=1

失败的请求url如下所示

localhost:24634/signer/signer/connect?transport=foreverFrame&connectionId=9b398750-99d6-4188-88b5-b41ad9eb82d5&connectionData=[{name:notifier}]&tid=1&frameId=1

您可能会注意到,在url中定义connectionData查询字符串参数的方式是不同的,特别是对于第一个url,connectionData已被url编码为查询字符串值,而第二个查询字符串参数已被html编码。我查看了请求头,失败的请求内容类型是text/html,第二个请求的内容类型是application/json

编辑3:

我在jquery.signalR-0.5.3.js文件中找到了解析connectionData的位置,下面是实际编码connectionData值的代码

if (connection.data) {
  qs += "&connectionData=" + window.escape(connection.data);
}

正如您所看到的,window.escape负责编码connectionData,但是,如果我调试这段代码,我可以看到window.escapeconnection.data确实是html编码connection.data而不是url编码。但这只发生在一个页面上,在另一个页面上,它按预期工作。

总之,问题是window.escape被第三方JS li覆盖了 布雷。这导致window.escape的行为与正常行为不同,导致信号器作为副作用失败

因此,基本上-当这些奇怪的问题发生时-检查您是否包含了干扰的库,并确保使用正确的名称空间,例如使用模块模式来避免此问题。

BUG

我不知道这是否有帮助,但在反序列化对象消息c时,当我试图反序列化json时,出现了一个意外的错误。 这有时发生在我身上,有时不会。我不知道这取决于什么

我的json是这样的:

在visual studio 2019上调试Xamarin应用程序时,我得到以下信息:

var content = await _client.GetStringAsync(Connection.URL);
invitaciones = JsonConvert.DeserializeObject<RootObject>(content);
可变内容有时给我,有时给我

如果你仔细看的话,你会发现两者是不同的,只是因为第一个在最后缺少了a}

如果使用工具反序列化这两个选项,然后在默认选项上验证结果,您将看到第一个选项无效,第二个选项有效

解决方案:

添加一个验证:如果字符串内容json没有以}结尾,那么在结尾加一个}。我知道这很愚蠢,但解决了我的问题

 var content = await _client.GetStringAsync(Connection.URL);
 if (!content.EndsWith("}"))
     content = content + "}";
 invitaciones = JsonConvert.DeserializeObject<RootObject>(content);

软件包:Newtonsoft.Json 12.0.2,Xamarin.Forms 3.6.0.344457。

什么时候发生异常?您是从客户端调用服务器端SendMessage集线器方法,还是?不,我什么都不做,只是等待页面加载。在fiddler中,我可以看到页面无法发出信号器请求,而且,我不得不在少数页面上使用这种逻辑客户端,而这种类型的异常只发生在其中一个页面上。从我在各种类似问题中可以看到,人们在使用Newtonsoft JSON序列化程序时遇到了一些问题,您可以尝试安装一个较新或较旧的版本,看看是否有什么不同。此外,您确定不能在任何客户端上复制此错误吗?客户端使用哪些浏览器?你看到浏览器控制台有什么错误吗?事实上,我试过重新安装Newtonsoft,甚至试过不同的版本,但都没用。我不能复制这个,我已经创建了类似的项目,它按预期运行。正如我提到的,这个完全相同的代码在同一个项目的另一个页面上工作,但是在这个页面上,它失败了。问题是,我看不出是谁在什么时候调用了堆栈跟踪中看到的JSON.NET API,以便更清楚地了解问题的原因。控制台中没有任何错误消息,我尝试了所有主要浏览器IE9+、Chrome/Firefox,结果都是一样的?