2012-09-26 54 views
15

Đây là chi tiết của hai câu hỏi, nhưng:Ghi nhật ký ngoại lệ SignalR?

  1. cách tốt nhất để có một ngoại lệ xử lý cấp cao nhất cho Hub của tôi là gì? Có vẻ như không thể với phiên bản hiện tại của SignalR

  2. Tại sao điều này thực sự không làm bất cứ điều gì trên máy khách khi tôi ném lỗi trong Hub của mình?

    $ .connection.hub.error (function() { cảnh báo trả về ("test"); });

Khi tôi gỡ lỗi, tôi có thể thấy phương pháp lỗi của tôi bị dây lên, nhưng khi tôi ném một ngoại lệ trên Hub, tôi có thể thấy không bao giờ có bất kỳ nỗ lực để gọi tôi thiết lập phương pháp trên. Điều duy nhất xảy ra là SignalR chặn các lỗi đến bàn điều khiển.

Đối với hồ sơ, tôi có thể cấp điện cho các sự kiện khác tốt

//Called during exceptions just fine 
$.connection.hub.received(function() { 
    return alert("Received Data"); 
}); 

//Seems to do nothing? 
$.connection.hub.error(function() { 
    return alert("Received Exception"); 
}); 

Trả lời

28

$.connection.hub.error được sử dụng để xử lý các sự cố kết nối trung tâm. Bạn có thể sử dụng lệnh deferred.fail() của jQuery để xử lý một ngoại lệ được ném từ một lời gọi trung tâm cụ thể ($.connection.hub.methodThatThrows().fail(function() { ... }), nhưng điều này rõ ràng không xử lý các ngoại lệ được ném từ bất kỳ lời gọi nào.

SignalR v1.0.0 sẽ thêm hỗ trợ cho IHubPipelineModules. Sau đó, bạn sẽ có thể ghi đè HubPipelineModule.BuildIncoming hoặc HubPipelineModule.OnIncomingError sau đó có thể được thêm vào HubPipeline qua GlobalHost.HubPipeline.AddModule(myHubPipelineModule).

https://github.com/SignalR/SignalR/issues/548

https://github.com/SignalR/SignalR/commit/83fdbfd9baa1f1cc3399d7f210cb062597c8084c

thực hiện Ví dụ:

using Microsoft.AspNet.SignalR.Hubs; 

public class MyHubPipelineModule : HubPipelineModule 
{ 
    protected override void OnIncomingError(ExceptionContext exceptionContext, 
              IHubIncomingInvokerContext invokerContext) 
    { 
     dynamic caller = invokerContext.Hub.Clients.Caller; 
     caller.ExceptionHandler(exceptionContext.Error.Message); 
    } 
} 

protected void Application_Start() 
{ 
    GlobalHost.HubPipeline.AddModule(new MyHubPipelineModule()); 
} 

// JS 
// hub.client is also introduced in SignalR v1.0.0 
$.connection.myHub.client.exceptionHandler = function (message) { 
    alert(message); 
}; 
+0

Thú vị và nhiều thông tin trả lời. Tôi đã nghĩ rằng sẽ có hỗ trợ để không phải móc phương pháp đăng nhập của tôi tại trang web cuộc gọi (và cho mỗi cuộc gọi lại trung tâm). Loại xấu xí nhưng tôi sẽ đưa ra với nó miễn là đó là cách duy nhất. Cảm ơn rất nhiều vì thông tin –

+0

Không nên là ngữ cảnh.Hub.Clients.Caller.ExceptionHandler (ex.Message); – Raghav

+1

@RaghavKhunger bạn nói đúng. Đã sửa. – halter73

Các vấn đề liên quan