5

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

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

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

public class Thing {
    public Double Foo { get; set; }
}

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

{"hub":"ThingHub","method":"AddThing","args":[{"Foo":"bar"}],"state":{},"id":1}

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

谢谢!

4

1 回答 1

11

SignalR 在客户端有一些逻辑,您可以使用它来检查来自客户端的服务器端集线器方法调用是否成功。

首先,要处理连接失败,您可以在集线器连接上使用错误处理程序(https://github.com/SignalR/SignalR/issues/404#issuecomment-6754425http://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 序列化程序引发异常 - 例如,在你的情况下:

Newtonsoft.Json.JsonSerializationException: Error converting value "Bar" to type 'System.Double'. Line 1, position 54. ---> System.FormatException:

...但是可以肯定的是,如果有比我上面描述的更好的方法来处理这种情况,那可能会很有趣——比如能够分辨出哪个确切的集线器调用导致了500 Internal Server Error.

于 2012-07-22T11:17:45.760 回答