2012-11-27 33 views
14

Tôi đang sử dụng trung tâm SignalR trong ứng dụng MVC4 của mình. Tôi đã thêm ELMAH để xử lý tất cả các lỗi. vấn đề là các lỗi xảy ra trong Hub không được đăng nhập vào ELMAH axd. Có cách nào để định cấu hình không?Cách định cấu hình ELMAH với SignalR

Trả lời

9

Bạn phải thêm HubPipelineModule và cũng đảm bảo bạn đặt một ApplicationName trong phần tử ErrorLog của mình, Nếu không Elmah sẽ không thể đăng nhập lỗi vì nó sẽ không có HttpContext hoặc AppName để đăng nhập .

<errorLog type="Elmah.SqlErrorLog, Elmah" applicationName="MyAppName" connectionStringName="myConnString" /> 

Các HubPipelineModule code I've used là như sau:

public class ElmahPipelineModule : HubPipelineModule 
{ 
    private static bool RaiseErrorSignal(Exception e) 
    { 
     var context = HttpContext.Current; 
     if (context == null) 
      return false; 
     var signal = ErrorSignal.FromContext(context); 
     if (signal == null) 
      return false; 
     signal.Raise(e, context); 
     return true; 
    } 

    private static void LogException(Exception e, IHubIncomingInvokerContext invokerContext) 
    { 
     var context = HttpContext.Current; 
     ErrorLog el = ErrorLog.GetDefault(context); 
     el.Log(new Error(e)); 
    } 

    protected override void OnIncomingError(Exception ex, IHubIncomingInvokerContext context) 
    { 
     var exception = ex; 
     if (ex is TargetInvocationException) 
     { 
      exception = ex.InnerException; 
     } 
     else if (ex is AggregateException) 
     { 
      exception = ex.InnerException; 
     } 

     if (!RaiseErrorSignal(exception)) 
      LogException(exception, context); 
    } 
} 

Hãy chắc chắn rằng bạn thêm các mô-đun cho đường ống trung tâm:

GlobalHost.HubPipeline.AddModule(new ElmahPipelineModule()); 

EDIT

SignalR 2+

Tôi nhận thấy không có ngoại lệ SignalR nào của mình đang được ghi lại trong một dự án gần đây mà tôi đã làm việc và đã phát hiện ra rằng một ArgumentNullException được ném khi cố gắng lấy ErrorSignal từ ngữ cảnh hiện tại. Phương thức sau đây xử lý đúng với ngoại lệ này để các lỗi SignalR được ghi lại một lần nữa.

private static bool RaiseErrorSignal(Exception e) 
{ 
    var context = HttpContext.Current; 
    if (context == null) 
     return false; 

    try 
    { 
     var signal = ErrorSignal.FromCurrentContext(); 
     if (signal == null) 
      return false; 
     signal.Raise(e, context); 
     return true; 
    } 
    catch (ArgumentNullException) 
    { 
     return false; 
    } 
} 
+1

Đối với bất kỳ ai khác bị kẹt ở bước cuối cùng, hãy thêm dòng cuối cùng đó vào lớp RegisterHubs. Ví dụ: 'public static void Start() {RouteTable.Routes.MapHubs(); GlobalHost.HubPipeline.AddModule (mới Shopperscape.Web.API.ElmahPipelineModule()); } ' – Chris

+0

@Chris Điều này làm việc cho SignalR 1.x? –

+1

@Giles - mã này dành cho SignalR 1 – damienc88

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