2014-03-01 4 views
1

이것은 나를 괴롭힌다.개체가 너무 일찍 처리됩니까?

class M1 : OwinMiddleware 
    { 
     public M1(OwinMiddleware next) : base(next) { } 
     public override Task Invoke(IOwinContext context) 
     { 
      return Task.Run(() => 
      { 
       Thread.Sleep(200); ; // do something 
       string reqUrl = context.Request.Uri.ToString(); //<- throws exception 
      }) 
       .ContinueWith(t => this.Next.Invoke(context)); 

     } 
    } 

후 시작 클래스 :이 M1에 경우 ObjectDisposedException을 던져 실행

public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      app.Use((context, next) => 
      { 
       return Task.Run(() => 
       { 
       }).ContinueWith(t => next()); 
      }); 

      app.Use<M1>(); 
     } 
    } 

:

가 삭제 된 개체에 액세스 할 수 없습니다 나는이 OWIN/카타나 미들웨어 있습니다. 개체 이름 : 'System.Net.HttpListenerRequest'.

스택 추적 : System.Net.HttpListenerRequest.get_UserHostName에서 System.Net.HttpListenerRequest.GetKnownHeader (HttpRequestHeader 헤더)에서 System.Net.HttpListenerRequest.CheckDisposed() (에서

)에서 Microsoft.Owin.HeaderDictionary.TryGetValue (문자열 키에 Microsoft.Owin.Host.HttpListener.RequestProcessing.RequestHeadersDictionary.TryGetValue (문자열 키 문자열 [] & 값) 문자열 [] & 브로 UE) Microsoft.Owin.OwinRequest.get_Host에서 Microsoft.Owin.Infrastructure.OwinHelpers.GetHost (IOwinRequest 요청)에서 Microsoft.Owin.Infrastructure.OwinHelpers.GetHeaderUnmodified (IDictionary 2 headers, String key) at Microsoft.Owin.Infrastructure.OwinHelpers.GetHeader(IDictionary 2 헤더, 문자열 키)에서()

전에 익명의 미들웨어를 제거하면 app.Use(); 예외가 발생하지 않습니다.

내가 잘못 했습니까?

+1

당신은 무엇을하려고합니까? – theMayer

+0

Owin의 일부 논리가 처리 한 후 비동기 적으로'context'에 액세스하는 것처럼 보입니다. 나는 Owin의 어떤 것도 모른다. 그러나 이것은 나에게 매우 복잡한 논리처럼 보인다. – theMayer

+0

방금 ​​학습을 시작했지만 Node/ExpressJS와 매우 비슷합니다. – Evgeni

답변

1

미들웨어를 실행하기 전에 owin 파이프 라인에 제어권을 반환하지 않으려면 ContinueWith 대신 await을 사용해야합니다. 다음과 같이 입력하십시오 :

class M1 : OwinMiddleware 
{ 
    public M1(OwinMiddleware next) : base(next) { } 
    public override async Task Invoke(IOwinContext context) 
    { 
     await Task.Run(() => 
     { 
      Thread.Sleep(200); ; // do something 
      string reqUrl = context.Request.Uri.ToString(); //<- throws exception 
     }); 

     await this.Next.Invoke(context);  
    } 
} 

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.Use(async (context, next) => 
     { 
      await Task.Run(() => { }); 
        await next(); 
      }); 

      app.Use<M1>(); 
     } 
    } 
} 
관련 문제