>

ASP.NET 4.5&Owin을 기반으로 샘플 SignalR 애플리케이션을 개발했으며 IIS 7.5에서 해당 앱을 호스팅했습니다.

모든 것이 잘 작동하지만 Owin에서 예외를 어떻게 처리 할 수 ​​있습니까?

다음 코드를 고려하십시오 :

[HubName("SampleHub")]
public class SampleHub : Hub
{
    public SampleHub()
    {
        throw new InvalidOperationException("?!");
    }
}

이 예외는 Application_Error 를 호출하지 않습니다.  (그리고 이것은 내 문제이다).

Application_Error 와 유사하게 로깅 및 디버깅 목적으로 Owin에서 모든 예외를 얻을 수있는 곳 ?

다음과 같은 것에 관심이 없습니다 :

app.UseErrorPage(new ErrorPageOptions()
{
    ShowCookies = true,
    ShowEnvironment = true,
    ShowExceptionDetails = true,
    ShowHeaders = true,
    ShowQuery = true,
    ShowSourceCode = true
});

ASP.NET 웹 API 및 ASP.NET MVC와 같은 고급 시나리오에는 전혀 쓸모가 없습니다.

재정의 목적으로 OnException 메소드를 사용하는 액션 필터가 훨씬 좋습니다.


  • 답변 # 1

    SignalR Hub에 대한 예외 처리를 원하는 경우 OWIN 미들웨어는가는방법이 아닙니다

    한 가지 이유를 설명하기 위해 Hub 메소드 내부에서 예외가 발생하면 SignalR이 WebSocket 전송을 사용한다고 가정하십시오. 이 경우 SignalR은 WebSocket 연결을 닫지 않습니다. 대신 SignalR은 JSON 인코딩 메시지를 소켓에 직접 작성하여 클라이언트에게 예외가 발생했음을 나타냅니다. OWIN 미들웨어를 사용하여 모든 종류의 이벤트를 트리거하는 쉬운 방법은 없습니다.

    다행히 SignalR은 시나리오에 가장 적합한 자체 허브 파이프 라인을 제공합니다.

    using System;
    using System.Diagnostics;
    using Microsoft.AspNet.SignalR.Hubs;
    public class MyErrorModule : HubPipelineModule
    {
        protected override void OnIncomingError(ExceptionContext exceptionContext, IHubIncomingInvokerContext invokerContext)
        {
            MethodDescriptor method = invokerContext.MethodDescriptor;
            Debug.WriteLine("{0}.{1}({2}) threw the following uncaught exception: {3}",
                method.Hub.Name,
                method.Name,
                String.Join(", ", invokerContext.Args),
                exceptionContext.Error);
        }
    }
    
    

    로깅 이외의 용도로 ExceptionContext를 사용할 수 있습니다. 예를 들어 ExceptionContext.Error를 다른 예외로 설정하면 클라이언트가받는 예외를 변경할 수 있습니다.

    ExceptionException.Error를 null로 설정하거나 ExceptonContext.Result를 설정하여 예외를 억제 할 수도 있습니다. 이렇게하면 클라이언트에게 Hub 메소드가 던지기 대신 ExceptonContext.Result에서 찾은 값을 반환 한 것으로 나타납니다.

    A는 허브 메소드에서 발생하는 모든 예외에 대해 단일 클라이언트 콜백을 호출하는 방법에 대한 다른 SO 답변을 작성했습니다. SignalR 예외 로깅?

    HubPipelineModules에 대한 MSDN 설명서도 있습니다. http://msdn.microsoft.com/en-us/library/microsoft.aspnet.signalr.hubs.hubpipelinemodule(v=vs.118).aspx

  • 답변 # 2

    @ halter73의 답변은 허브 내부에서 발생하는 오류에 적합하지만 생성 중에 발생한 오류는 포착하지 않습니다.

    예외가 발생했습니다 :

    와이즈 비즈

    이 예외에 대해 서버가 HTML 페이지를 반환했지만 Angular 앱과 더 잘 통합하기 위해 JSON 형식으로 필요했기 때문에이 답변을 바탕으로

    System.InvalidOperationException: 'foobarhub' Hub could not be resolved.

    를 구현했습니다.  예외를 포착하고 출력 형식을 변경합니다. 대신 오류를 로깅하는 데 사용할 수 있습니다.

    OwinMiddleware
    
    

    public class GlobalExceptionMiddleware : OwinMiddleware { public GlobalExceptionMiddleware(OwinMiddleware next) : base(next) { } public override async Task Invoke(IOwinContext context) { try { await Next.Invoke(context); } catch (Exception ex) { context.Response.ContentType = "application/json"; context.Response.StatusCode = 500; await context.Response.WriteAsync(JsonConvert.SerializeObject(ex)); } } } 에 등록 추가 그냥 OwinStartup.cs 전에 배치해야  메소드 호출 :

    MapSignalR
    
    
    public class OwinStartup { public void Configuration(IAppBuilder app) { app.Use<GlobalExceptionMiddleware>(); // must come before MapSignalR() app.MapSignalR(); } }

  • 이전 reactjs - Reactrender () 내부에 여러 요소를 반환
  • 다음 javascript - 반복되는 If 문을 개선하려면 어떻게해야합니까?