2015-10-28 15 views
5

Sto riscontrando alcune difficoltà con OWIN in un'impostazione di ASP.NET WebApi2. La prima richiesta dopo un riavvio determina l'eccezione: API Web con OWIN genera ObjectDisposedException per HttpMessageInvoker

 
    [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 
Credo che il problema sia causato da un'attività in esecuzione quando si colpisce EF DbContext per la prima volta. Tutto sommato la prima richiesta è di circa 4-6000 ms. Dopo questa prima richiesta non ci sono più eccezioni.

ho riprodotto il problema in forma semplificata con un progetto WebAPI e il successivo avvio OWIN (e non 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); 
    } 
} 

aggiungo un controller:

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

Quando Chiedo che la prima richiesta risulti nell'eccezione.

+0

Ho lo stesso problema. Forse se nessuno ha una risposta, dovrebbe essere segnalato al team di asp.net? –

+0

Ho appena avuto la stessa eccezione. Penso che sia un bug. – tia

risposta

4

Questa è una vecchia questione, ma Ore appena trascorso cercando di battere l'ObjectDisposedException e appena trovato una soluzione che questa link mi ha aiutato con:

Quando il vostro Owin API Web deve funzionare in ambienti self-hosting si associa il API web config nella classe di avvio Owin

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

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

Se si intende utilizzare IIS come host per l'Owin web api quindi associare la configurazione web api nella classe ASax globale

protected void Application_Start(object sender, EventArgs e) 
{ 
    GlobalConfiguration.Configure(WebApiConfig.Register); 
} 

Questo ha eliminato l'ObjectDisposedException e la mia web api funziona come un fascino

Problemi correlati