2013-11-22 13 views
5

Sono nuovo di asp.net 4.5 async e sto correndo nel seguente con la chiamata response.redirect all'interno di un metodo asincrono. Il problema è che la risposta "si blocca" Qualcun altro ha riscontrato problemi simili con il tentativo di reindirizzamento con async? Questo codice funzionerà in un nuovo progetto, ma non funziona con una nuova pagina nel nostro codice esistente. Mi sono assicurato di svuotare tutto ciò che potevo dal nostro web.config e rimosso la nostra pagina principale. Colpire un muro di mattoni ... qualche idea? Grazie!Response.Redirect problema con Asp.net async

protected void Page_Load(object sender, EventArgs e) 
    { 
     RegisterAsyncTask(new PageAsyncTask(PageLoadAsync)); 
    } 

    private async Task PageLoadAsync() 
    { 
     var data = await GetData(); 

     if (data == HttpStatusCode.OK) 
      Response.Redirect("http://www.google.com"); 
    } 

    private async Task<HttpStatusCode> GetData() 
    { 
     using (var client = new HttpClient()) 
     { 
      var response = await client.GetAsync("https://www.google.com"); 
      return response.StatusCode; 
     } 
    } 
+1

Non penso che sia possibile eseguire 'Redirect' su thread asincrono –

+0

Non vedo perché sia ​​necessario async, è comunque necessario attendere che HttpClient risponda prima di terminare il caricamento/rendering della pagina. E non stai facendo più cose allo stesso tempo. btw: se hai una connessione internet, google funzionerà sempre;) –

+3

Ha bisogno di async perché sta facendo un task I/O intensivo (inviando una richiesta HTTP a una risorsa remota). Immagina che questa risorsa impieghi molto tempo per rispondere. Durante questo periodo, il thread di lavoro ASP.NET verrà compromesso. Ora immagina che questo endpoint sia colpito da 200 utenti allo stesso tempo => il tuo sito morirà perché non ci saranno thread di lavoro disponibili per soddisfare le richieste. Ecco perché è estremamente importante utilizzare async in questo caso. –

risposta

10

Questo codice funzionerà in un nuovo progetto, ma, non funziona con una nuova pagina nel nostro codice esistente.

Presumo che il sito esistente sia già stato aggiornato a .NET 4.5.

La prima cosa da verificare è che httpRuntime.targetFramework è impostato su 4.5. Questo è non impostato per impostazione predefinita quando si aggiorna.

Edit da commenti:

Un'altra cosa da controllare (nel caso) è che Page.Async è impostato su true.

In questo caso, la soluzione era chiamare Response.Redirect("http://www.google.com", false), che passa esplicitamente false per il parametro endResponse. Il valore predefinito di true è solo per ragioni di compatibilità all'indietro as described here.

+0

Buon punto. Il nostro progetto è 4.5 e il targetFramework è 4.5 nella nostra configurazione. Abbiamo implementato async in dieci o più pagine ora e funziona. Il problema è che due delle nostre pagine devono eseguire un reindirizzamento dopo una chiamata asincrona sulla stessa risposta. Cercando di capire le differenze in questo momento tra il progetto di test e il nostro progetto. Apprezzo la risposta. – newman

+0

Quasi non oso chiedere questo, ma hai 'Page.Async' impostato su' true', giusto? –

+0

Un'altra domanda valida. Si. – newman