SignalR和500错误

Jas*_*son 5 signalr

到目前为止,我一直非常成功地使用SignalR,但我发现我无法找到任何记录的参考或解决方案.

我有一个服务器端函数,其类参数具有Double属性

public bool AddThing(Thing thing)
{
    // add and notify client
}

public class Thing {
    public Double Foo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果我使用文本而不是属性Foo的数字发送Thing对象,则服务器正确地返回500错误

{"hub":"ThingHub","method":"AddThing","args":[{"Foo":"bar"}],"state":{},"id":1}
Run Code Online (Sandbox Code Playgroud)

由于这是在SignalR上下文启动之前发生的,如何处理客户端的错误?Hub是否有任何特殊的回调或属性需要检查?我需要对服务器端的Hub做些什么特别的事情吗?

谢谢!

Las*_*sen 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...');
});
Run Code Online (Sandbox Code Playgroud)

因此,当我通过在服务器端实现这一点来重新创建场景时:

public bool AddThing(Thing thing)
{
    return true;
}

public class Thing
{
    public Double Foo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

..然后从客户端调用它:

myHub.addThing({"Foo":"Bar"});
Run Code Online (Sandbox Code Playgroud)

error处理函数被调用,文本An error occurred...打印到控制台.

你可以做的另一件事 - 因为在服务器上调用一个方法返回一个jQuery延迟对象(https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs),你可以链接几个回调来自调用的返回对象.例如,文档提供了此示例:

myHub.someMethod()
     .done(function(result) {
     })
     .fail(function(error) {
     });
Run Code Online (Sandbox Code Playgroud)

应该注意的是,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.