Signalr 信号器返回错误-反序列化对象时意外结束
我有一个简单的项目,我正在使用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,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中检查
[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,结果都是一样的?