7 messaggi dal 27 luglio 2011
Salve a tutti, sto tentando di utilizzare le api di Google+ e Youtube in un'applicazione Web Form. Ho generato il progetto e configurato l'autenticazione con i servizi di Google...e fin qui tutto liscio come l'olio. Ora sto tentando di recuperare informazioni sull'account dell'utente collegato. Creo il servizio lo interrogo e in debug tutto sembra funzionare. Quando però lo pubblico sul server di produzione l'applicazione non funziona. In pratica IIS chiude la connessione e dopo vari tentativi addirittura crasha l'application pool. Rieseguendo il progetto in debug ho notato che nell'output vengono riportati una serie di messaggi tipo "Il thread 0x546c è terminato con il codice 259 (0x103)". Suppongo che sia questa la causa dei crash di IIS.

Qualcuno può darmi qualche idea su come risolvere il problema?
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
cerca per prima cosa di capire cosa sta facendo crashare la tua applicazione. Forse si stanno verificando delle eccezioni non gestite? Quale riga di codice le sta causando?
Prova a gestire e loggare questo tipo di eccezioni a livello globale, aggiungendo il metodo Application_Error al global.asax, come vedi fare qui:
http://stackoverflow.com/questions/10751363/how-do-i-make-a-generic-error-page-in-my-asp-net-application-so-that-it-handle/10751939#10751939

Se hai accesso al server di produzione, vai a vedere nel suo EventLog se risultano eventi che possano giustificare il crash dell'applicazione. Leggi la descrizione dell'evento, magari ti è d'aiuto in qualche modo.

Omnimig ha scritto:

Ora sto tentando di recuperare informazioni sull'account dell'utente collegato

Giusto per non dare nulla per scontato: hai fatto autenticare l'utente su Google prima di accedere alle sue informazioni? Ti ha dato il permesso per accedervi, tramite la pagina di autorizzazione?

ciao,
Moreno
Modificato da BrightSoul il 15 agosto 2014 09.19 -

Enjoy learning and just keep making
7 messaggi dal 27 luglio 2011
Ciao Moreno, grazie per la tua risposta...sei un barlume di luce in un momento di buio sconforto!! :o)

Allora, mi sono messo in contatto con il supporto tecnico del servizio di hosting su cui ho pubblicato il sito e mi hanno inviato lo stack trace che descrive il crash dell'application pool. E' un errore stranissimo anche perché sia sulla macchina di sviluppo che su una macchina di test su cui è installato un semplice win7 pro con iis integrato tutto funziona senza alcuna difficoltà.

A proposito della tua domanda, l'utente è sicuramente autenticato su Google tant'è vero che in debug i servizi di Google mi restituiscono tutte le informazioni di cui ho bisogno.

Ti sarò debitore a vita se riesci a darmi una mano...sono due settimane che cerco su google e leggo l'impossibile senza trovare la strada!!

Posto il trace completo di seguito...

The followings are some of the error logs shown on the Windows Event Viewer:


Application pool nextalent.it(domain)(4.0)(pool) is being automatically disabled due to a series of failures in the process(es) serving that application pool.

A process serving application pool nextalent.it(domain)(4.0)(pool) terminated unexpectedly. The process id was 10420. The process exit code was 0x0.

A process serving application pool nextalent.it(domain)(4.0)(pool) suffered a fatal communication error with the Windows Process Activation Service. The process id was 22408. The data field contains the error number.



Event code: 3005 

Event message: An unhandled exception has occurred. 

Event time: 8/11/2014 2:46:29 PM 

Event time (UTC): 8/11/2014 12:46:29 PM 

Event ID: 4c879b1a9cee405ba836d397cb845a92 

Event sequence: 24 

Event occurrence: 1 

Event detail code: 0 

 

Application information: 

    Application domain: /LM/W3SVC/391/ROOT-1-130522344649626330 

    Trust level: Full 

    Application Virtual Path: / 

    Application Path: C:\ClientSites\nextalent.it\httpdocs\ 

    Machine name: ASPHOST72 

 

Process information: 

    Process ID: 22408 

    Process name: w3wp.exe 

    Account name: ASPHOST72\IWPD_1404(nextalent) 

 

Exception information: 

    Exception type: HttpException 

    Exception message: Server cannot append header after HTTP headers have been sent.

   at System.Web.HttpHeaderCollection.SetHeader(String name, String value, Boolean replace)

   at System.Web.HttpHeaderCollection.Set(String name, String value)

   at Microsoft.Owin.Host.SystemWeb.CallHeaders.AspNetResponseHeaders.Set(String key, String[] values)

   at Microsoft.Owin.Host.SystemWeb.CallHeaders.AspNetResponseHeaders.set_Item(String key, String[] value)

   at Microsoft.Owin.Infrastructure.OwinHelpers.SetHeaderUnmodified(IDictionary`2 headers, String key, String[] values)

   at Microsoft.Owin.Infrastructure.OwinHelpers.AppendHeaderUnmodified(IDictionary`2 headers, String key, String[] values)

   at Microsoft.Owin.HeaderDictionary.AppendValues(String key, String[] values)

   at Microsoft.Owin.ResponseCookieCollection.Append(String key, String value, CookieOptions options)

   at Microsoft.Owin.Security.Cookies.CookieAuthenticationHandler.<ApplyResponseGrantAsync>d__b.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   at Microsoft.Owin.Security.Infrastructure.AuthenticationHandler.<ApplyResponseCoreAsync>d__8.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   at Microsoft.Owin.Security.Infrastructure.AuthenticationHandler.<TeardownAsync>d__5.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   at Microsoft.Owin.Security.Infrastructure.AuthenticationMiddleware`1.<Invoke>d__0.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   at Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware`2.<Invoke>d__0.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   at Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware`2.<Invoke>d__0.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar)

   at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar)

   at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()

   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)



 

 

Request information: 

    Request URL: https://www.nextalent.it:443/ 

    Request path: / 

    User host address: 80.17.186.228 

    User: marioignozzi@gmail.com 

    Is authenticated: True 

    Authentication Type: ApplicationCookie 

    Thread account name: ASPHOST72\IWPD_1404(nextalent) 

 

Thread information: 

    Thread ID: 21 

    Thread account name: ASPHOST72\IWPD_1404(nextalent) 

    Is impersonating: False 

    Stack trace:    at System.Web.HttpHeaderCollection.SetHeader(String name, String value, Boolean replace)

   at System.Web.HttpHeaderCollection.Set(String name, String value)

   at Microsoft.Owin.Host.SystemWeb.CallHeaders.AspNetResponseHeaders.Set(String key, String[] values)

   at Microsoft.Owin.Host.SystemWeb.CallHeaders.AspNetResponseHeaders.set_Item(String key, String[] value)

   at Microsoft.Owin.Infrastructure.OwinHelpers.SetHeaderUnmodified(IDictionary`2 headers, String key, String[] values)

   at Microsoft.Owin.Infrastructure.OwinHelpers.AppendHeaderUnmodified(IDictionary`2 headers, String key, String[] values)

   at Microsoft.Owin.HeaderDictionary.AppendValues(String key, String[] values)

   at Microsoft.Owin.ResponseCookieCollection.Append(String key, String value, CookieOptions options)

   at Microsoft.Owin.Security.Cookies.CookieAuthenticationHandler.<ApplyResponseGrantAsync>d__b.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   at Microsoft.Owin.Security.Infrastructure.AuthenticationHandler.<ApplyResponseCoreAsync>d__8.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   at Microsoft.Owin.Security.Infrastructure.AuthenticationHandler.<TeardownAsync>d__5.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   at Microsoft.Owin.Security.Infrastructure.AuthenticationMiddleware`1.<Invoke>d__0.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   at Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware`2.<Invoke>d__0.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   at Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware`2.<Invoke>d__0.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar)

   at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar)

   at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()

   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
l'errore per fortuna è chiaro: un componente della tua applicazione vorrebbe aggiungere delle intestazioni HTTP quando ormai un altro componente ha già comandato al server di inviare il corpo della risposta al client.

Server cannot append header after HTTP headers have been sent.


Grazie allo stack trace che hai postato, ho trovato questa discussione in cui si parla del tuo stesso problema.
http://katanaproject.codeplex.com/discussions/540202
Viene spiegato bene in questo post:
http://katanaproject.codeplex.com/discussions/540202#PostDetailsCell_1247029

In pratica, il componente che si occupa di aggiornare le scadenze dei cookies lo fa troppo tardi - o meglio - c'è qualche altro componente (che potrebbe essere qualsiasi cosa, magari del codice scritto da te o la stessa Google API client library) che sta inviando la risposta al client prematuramente.
In giro per la tua applicazione potrebbe esserci qualche istruzione Response.Flush() che sta causando questo invio prematuro.
Se riesci ad identificare questa linea di codice a cui mi sto riferendo, allora hai trovato il problema.
Se non riesci ad identificarla, perché magari è "nascosta" in un componente che non hai scritto tu, allora - a malincuore - dovresti provare a disabilitare la sliding expiration dei cookies di autenticazione, come indicato nella discussione di cui sopra. Esempio. Questa roba si trova sotto /App_start/Startup.Auth.cs. Guarda giusto la parte in grassetto.

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
SlidingExpiration = false,
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});


Omnimig ha scritto:

sulla macchina di sviluppo che su una macchina di test su cui è installato un semplice win7 pro con iis integrato tutto funziona senza alcuna difficoltà.

Forse non hai incontrato l'errore perché non l'hai testato abbastanza a lungo? L'aggiornamento della scadenza dei cookies non si verifica sempre, ma solo quando il cookie è prossimo alla scadenza.

ciao,
Moreno

Enjoy learning and just keep making
7 messaggi dal 27 luglio 2011
Ciao Moreno, grazie ancora per la tua risposta!

L'articolo che mi hai indicato l'avevo letto anche io...sembra proprio lo stesso mio problema se non fosse per il comportamento del web server di produzione. In pratica nel mio caso l'errore non è sporadico ma sistematico. Mi spiego meglio. L'utente arriva sul mio sito, esegue il login con Google e viene correttamente autenticato. Successivamente clicca sul link per accedere al suo profilo e, dal momento che in quella pagina io eseguo le chiamate al servizio di Google, il server tronca la connessione. E questo accade sin dal primo momento...non quando il cookie è prossimo alla scadenza. Per questo trovo la cosa estremamente strana... Sul server di sviluppo e su uno di test invece non si verifica niente di tutto questo. In produzione invece non appena disabilito il WebUserControl che interagisce con Google il server riprende a funzionare.

Mi sto scervellando...

Ora proverò a seguire il tuo suggerimento disabilitando lo slidingexpiration...incrociamo le dita...
7 messaggi dal 27 luglio 2011
Ciao di nuovo, ho provato a disattivare lo SlidingExpiration ma purtroppo il problema persiste...

Non so più che fare...spero tu abbia qualche altra idea altrimenti sono alla deriva :o)

Grazie comunque moltissimo per il tuo tempo e la tua disponibilità.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao, prego!

Omnimig ha scritto:

questo accade sin dal primo momento...non quando il cookie è prossimo alla scadenza

Ok, tuttavia il problema è quello: c'è questo componente che scrive le intestazioni dei cookies di autenticazione quando ormai è troppo tardi. Può darsi che l'errore si verifichi proprio quando il cookie viene aggiunto per la prima volta.
Lo stack trace indica appunto che l'istruzione proviene dal componente che si occupa di gestire i cookie di autenticazione. Sei convinto di questo fatto?
 at Microsoft.Owin.ResponseCookieCollection.Append(String key, String value, CookieOptions options)


Omnimig ha scritto:

sia sulla macchina di sviluppo che su una macchina di test tutto funziona senza alcuna difficoltà.

E' un po' difficile capire come mai. Abbiamo solo uno stack trace che ci ha aiutati a risalire alla fonte del problema ma poi per risolverlo penso che servano altre indagini e altre informazioni.

Per esempio abbiamo questo WebUserControl che non sappiamo come funziona e come si comporta in base all'ambiente in cui è hostato.

non appena disabilito il WebUserControl che interagisce con Google il server riprende a funzionare.

Ok, dato che **probabilmente** è lui a fare il flush della risposta, proverei a non usarlo, e ad usare invece le API della client library di Google.
Vedi se questo ti può aiutare.
http://gusclass.com/blog/2014/04/16/how-to-oauth-2-0-flows-using-the-google-net-api-client-libraries-1-7-in-c/

ciao,
Moreno

Enjoy learning and just keep making
7 messaggi dal 27 luglio 2011
Ciao Moreno,
sono d'accordo con te sull'origine del problema. Lo stack trace è piuttosto chiaro. Ora però vorrei capire come aggirarlo...e soprattutto in cosa l'ambiente di produzione differisce da quello di test dal momento che è solo lì che non riesco a far funzionare l'applicazione.

Tengo a precisare inoltre che il WebUserControl di cui parlo non è altro che un componente scritto da me che si occupa di istanziare e chiamare i servizi di Google usando le Google Client API.

Mica sapresti indirizzarmi su come fare altri test per andare a fondo sulla cosa?

P.S. se può esserti utile ti invio il codice in questione

Ciao e grazie ancora,
Mario
Modificato da Omnimig il 20 agosto 2014 11.17 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.