2015-10-28 14 views
5

ASP.NET WebApi2設定でOWINに問題が発生しています。再起動後の最初のリクエストでは、例外が発生します。 OWINを使用したWeb APIがHttpMessageInvokerのObjectDisposedExceptionをスローする

 
    [ObjectDisposedException: Cannot access a disposed object. 
    Object name: 'System.Net.Http.HttpMessageInvoker'.] 
     System.Net.Http.HttpMessageInvoker.CheckDisposed() +327456 
     System.Net.Http.HttpMessageInvoker.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) +24 
     System.Web.Http.Owin.<InvokeCore>d__0.MoveNext() +501 
     System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 
     System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
     Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.<RunApp>d__5.MoveNext() +187 
     System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 
     System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
     Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.<DoFinalWork>d__2.MoveNext() +185 
     Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar) +69 
     Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar) +64 
     System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +483 
     System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +157 
この問題は、EF DbContextに初めてアクセスしたときに長時間実行されるタスクが原因であると考えられます。すべての最初の要求はすべて約4-6000msです。この最初の要求の後、それ以上の例外はありません。

私はWEBAPIプロジェクトと、次のOWINの起動(なしGlobal.asaxの)を簡略化した形で問題を再現しています

public class Startup 
{ 
    public void Configuration(IAppBuilder app) { 
     var config = new HttpConfiguration(); 
     config.MapHttpAttributeRoutes(); 

     // ---- simulate long running initialization code ------- 
     Thread.Sleep(3000); 
     // ------------------------------------------------------ 

     app.UseWebApi(config); 
    } 
} 

私はコントローラを追加:

[Route("api/test/number")] 
public class TestController : ApiController 
{ 
    public object Get() { 
     return 42; 
    } 
} 

私はこれを要求して、最初のリクエストで例外が発生します。

+0

私はこの同じ問題があります。おそらく誰も応答がない場合は、asp.netチームに報告する必要がありますか? –

+0

私も同じ例外があります。私はバグだと思う。 – tia

答えて

4

これは、古い質問ですが、ちょうど過ごした時間は説明ObjectDisposedExceptionを破っしようとちょうどこのlinkはで私を助けた解決策が見つかりました:あなたのowinウェブAPIを使用すると、バインドセルフホスティング環境で実行する必要がある場合には

をowin起動クラス内のWeb APIの設定

public void Configuration(IAppBuilder app) 
{ 
    ConfigureOAuth(app); 

    HttpConfiguration config = new HttpConfiguration(); 
    WebApiConfig.Register(config); 
    app.UseWebApi(config); 
} 

あなたのowinウェブAPIのホストとしてIISを使用する場合は、グローバルasaxクラスで

protected void Application_Start(object sender, EventArgs e) 
{ 
    GlobalConfiguration.Configure(WebApiConfig.Register); 
} 
をウェブAPIの設定をバインド

これはObjectDisposedExceptionを排除し、私のWeb APIは魅力のように動作します

関連する問題