2012-07-22 109 views
4

到目前爲止,我一直在玩SignalR非常成功,但我發現了一種情況,我沒有真正能夠找到任何記錄的參考或解決方案。SignalR和500錯誤

我有一個具有雙重屬性

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

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

如果我送東西對象隨文字而不是數量的財產美孚

服務器理所當然地返回500錯誤類參數的服務器端功能
{"hub":"ThingHub","method":"AddThing","args":[{"Foo":"bar"}],"state":{},"id":1} 

由於這發生在SignalR上下文啓動之前,在客戶端如何處理錯誤? Hub是否有任何特殊的回調或屬性檢查?服務器端需要做什麼特別的事情嗎?

謝謝!

回答

10

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

+0

這是一個非常明確和簡潔的答案,我將其標記爲這樣,因爲我還沒有找到更好的解決方案。我仍然無法確定SignalR坐在asp.net管道中的位置,以及如何以有意義的格式捕獲並返回上述錯誤。該文檔還將$ .connection.error作爲一個函數,而我可以找到並使用的是$ .connection.hub.error。不確定如果這是一個文檔或理解錯誤。 – Jason 2012-07-24 12:21:27