到目前为止,我一直非常成功地使用SignalR,但我发现我无法找到任何记录的参考或解决方案。
我有一个服务器端函数,其类参数具有Double属性
public bool AddThing(Thing thing)
{
// add and notify client
}
public class Thing {
public Double Foo { get; set; }
}
如果我发送带有文本的Thing对象而不是属性Foo的数字
,服务器会正确地返回500错误{"hub":"ThingHub","method":"AddThing","args":[{"Foo":"bar"}],"state":{},"id":1}
由于这是在SignalR上下文启动之前发生的,如何处理客户端的错误? Hub是否有任何特殊的回调或属性需要检查?我需要对服务器端的Hub做些什么特别的事情吗?
谢谢!
答案 0 :(得分:11)
SignalR在客户端有一些逻辑,可用于检查来自客户端的服务器端集线器方法调用是否成功。
首先,要处理连接失败,您可以使用集线器连接上的错误处理程序(https://github.com/SignalR/SignalR/issues/404#issuecomment-6754425,http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client),如下所示:
$.connection.hub.error(function() {
console.log('An error occurred...');
});
因此,当我通过在服务器端实现这一点来重新创建场景时:
public bool AddThing(Thing thing)
{
return true;
}
public class Thing
{
public Double Foo { get; set; }
}
..然后从客户端调用它:
myHub.addThing({"Foo":"Bar"});
调用error
处理函数,并将文本An error occurred...
打印到控制台。
您可以做的另一件事 - 因为在服务器上调用方法会返回一个jQuery延迟对象(https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs),您可以从调用链接返回对象上的几个回调。例如,文档提供了此示例:
myHub.someMethod()
.done(function(result) {
})
.fail(function(error) {
});
应该注意的是,fail
仅在集线器调用期间出现错误时调用(例如,在服务器端方法内引发异常) - https://github.com/SignalR/SignalR/issues/404#issuecomment-6754425。
最后一点 - 我认为这是一个有趣的问题,因为正如我所看到的那样,JSON Serializer会抛出异常 - 例如,在你的情况下:
Newtonsoft.Json.JsonSerializationException: Error converting value "Bar" to type 'System.Double'. Line 1, position 54. ---> System.FormatException:
...但是可以肯定的是,如果有比我上面描述的方法更好的方法来处理这种情况可能会很有趣 - 比如能够分辨出哪个精确的集线器调用导致了500 Internal Server Error
。