2016-03-21 128 views
3

錯誤處理程序被添加像這樣的客戶:如何在客戶端處理SignalR服務器異常?

$.connection.hub.url = "/signalr"; 
$.connection.hub.logging = true; 
$.connection.hub.error(function(error) { 
    console.log('SignalrAdapter: ' + error); 
}); 

$.connection.hub.start().done(function() { me.onStartDone(); }); 
// ... 

在服務器,它是:

hubConfiguration.EnableDetailedErrors = true; 

因此到the docs這應該是足夠了。

在我的異常拋出它只是顯示一個記錄文本,並不會調用處理程序:

[18:18:19 GMT+0000()] SignalR: ... [[[my error description here]]] ... 

在我CSHTML頁:

<script src="~/Scripts/vendor/jquery.signalR-2.1.2.js"></script> 
<script src="~/signalr/hubs"></script> 

但是,如果我附上一個錯誤處理程序該方法本身被稱爲:

$.connection.operatorHub.server.myMethodName(someParam).fail(function(error) { 
    console.log("Error handler called: " + error); 
}); 

如何處理一般錯誤?

UPDATE。 答案如下。還看到這些:

希望它可以幫助別人。

+0

你可以嘗試禁用日誌記錄'$ .connection.hub.logging = TRUE;' –

+0

@QuentinRoger不,它並不能幫助。 – Artyom

+0

奇怪的是,如果我停在方法的錯誤處理程序上並評估堆棧中捕獲的內容,那麼一般錯誤處理程序會被調用。 – Artyom

回答

9

我測試了一個小聊天項目(downloaded here)看來這個方法只處理連接錯誤。

$.connection.hub.error(function(error) { 
    console.log('SignalrAdapter: ' + error); 
}); 

我能夠處理HubPipelineModule類的所有例外。

1)I創建了一個SOHubPipelineModule

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

2)I增加了模塊GlobalHost.HubPipeline

// Any connection or hub wire up and configuration should go here 
    GlobalHost.HubPipeline.AddModule(new SOHubPipelineModule()); 
    var hubConfiguration = new HubConfiguration { EnableDetailedErrors = true }; 
    app.MapSignalR(hubConfiguration); 

3)我ChatHub類:

public class ChatHub : Hub 
    { 
     public void Send(string name, string message) 
     { 
      throw new Exception("exception for Artyom"); 
      Clients.All.broadcastMessage(name, message); 
     } 

    } 

4)在JS我使用此代碼來獲取我的異常消息:

$.connection.chatHub.client.exceptionHandler = function (error) { 
     console.log('SignalrAdapter: ' + error); 
     alert('SignalrAdapter: ' + error); 
};  

enter image description here

+0

有趣的方式。不知道有關'HubPipelineModule.OnIncomingError'。嘗試了這個小聊天項目。它在那裏工作。但是這在我的項目中不起作用。研究這一點。在我的項目中,我有信號員組,autofac,owin等。並在客戶端...這似乎很複雜。 – Artyom

+0

而這看起來像一些破解。爲什麼不把錯誤放在第一位,而不是讓第二次打電話給客戶? – Artyom

+0

我知道這是醜陋的,但我認爲它是處理集線器的所有異常的唯一方法:( –

4

我用過的錯誤處理在客戶端上這樣的:

它是SignalR版本2

更多細節:SignalR documentation - How to handle errors in the Hub class

樞紐 - AppHub。CS:

public class AppHub : Hub 
    { 
     public void Send(string message) 
     { 
      throw new HubException("Unauthorized", new { status = "401" }); 
     } 
    } 

客戶端:

$(function() { 

      var appHub = $.connection.appHub; 

      $.connection.hub.start().done(function() { 

       appHub.server.send("test message") 
        .fail(function (e) { 

         if (e.source === 'HubException') { 
          console.error("Error message: ", e.message); 
          console.error("Error status: ", e.data.status); 
         } 

        }); 
      }); 

     }); 
+0

那麼,它工作嗎? – Artyom

+0

是的,它工作正常:) – Jenan

+0

值得注意的是,這增加了SignalR 2 – Learner

相關問題