Poblemi Download file log

mercoledì 13 luglio 2011 - 18.27

alepiaggio83 Profilo | Newbie

Ciao a tutti,
ho il seguente problema, provo a esporlo..

Ho pensato a un modo per scaricare un file di testo per loggare degli errori..
Per maggiore chiarezza posto il codice:


// Se è stato scritto qualcosa sul LogBuffer ne effettuo il download
if (l_LogBuffer.Count() != 0)
{

Response.Clear();
Response.ContentType = "text/plain";
Response.AddHeader("Content-Disposition", "attachment; filename = LogMessages.txt");
Response.BinaryWrite(l_LogBuffer);
Response.Flush();
Response.Close();
HttpContext.Current.ApplicationInstance.CompleteRequest();
}

Il problema è che se nel LogBuffer c'è qls le istruzioni vengono eseguite ma invece si crea un qualche conflitto con la parte precedente del codice che non viene eseguita correttamente..
se invece nel LogBuffer non viene scritto nulla (e quindi non entro in quel if) le istruzioni precedenti vengono eseguite correttamente...
Posto tutto il pezzo di codice a cui mi riferisco:

if (DatabaseWrapper.ImportExcelFile(l_CognomeUtenteChanger, l_NomeUtenteChanger, "_FORNITORI_GRUPPI_ACQUISTO_", l_FileToUpload, l_Extension, out l_LogBuffer))
{
l_ErrorMessage = "Il file " + m_FileUpload.FileName + " è stato importato correttamente";
CommonFunctions.DisplayMessageBox(Page, this.GetType(), l_ErrorMessage);
}

else
l_ErrorMessage = "Il file " + m_FileUpload.FileName + " è stato importato parzialmente a causa di errori nel file Excel";
CommonFunctions.DisplayMessageBox(Page, this.GetType(), l_ErrorMessage);


m_GridView01_Update();
m_GridView01.DataBind();

// Se è stato scritto qualcosa sul LogBuffer ne effettuo il download
if (l_LogBuffer.Count() != 0)
{

Response.Clear();
Response.ContentType = "text/plain";
Response.AddHeader("Content-Disposition", "attachment; filename = LogMessages.txt");
Response.BinaryWrite(l_LogBuffer);
Response.Flush();
Response.Close();
//Response.End();
HttpContext.Current.ApplicationInstance.CompleteRequest();
}

Please Help Meeeeee!!!
Grazie in anticipo

Gluck74 Profilo | Guru

scusa, ma parli di un ipotetico errore, di un conflitto, ma non ci dici qual'è questo errore/conflitto.

Spiegati meglio

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

alepiaggio83 Profilo | Newbie

Hai ragione scusa...

Per conflitto intendo dire che se non c'è nulla in l_LogBuffer, allora viene mostrato correttamente il messaggio di errore con la messageBox (mi riferisco a: CommonFunctions.DisplayMessageBox(Page, this.GetType(), l_ErrorMessage) e viene correttamente refreshata la GridView (istruzioni: m_GridView01_Update(); m_GridView01.DataBind();).

Se invece nel log c'è qualcosa (e quindi entro nell'if che ho postato), sembra eseguire tutto bene ma mi restituisce la schermata che allego dando all'utente la possibilità di scaricare il file di log senza prima però farmi vedere la MessageBox e senza refreshare la GridView (per vedere il refresh devo farlo manualmente con il pulsante di comando nella GridView).
E' più chiaro il problema?

Grazie

Alessandra


1337x726 32Kb

Gluck74 Profilo | Guru

ma in che posizione si trova il codice che hai scritto? in quale evento della painga?

c'è una cosa che non mi torna:

>Response.Clear();
Pulisce il response, quindi a regola dovresti aver cancellato tutto il contenuto della pagina

>Response.ContentType = "text/plain";
>Response.AddHeader("Content-Disposition", "attachment; filename = LogMessages.txt");
>Response.BinaryWrite(l_LogBuffer);
>Response.Flush();
>Response.Close();
trasformi la risposta dal server, in una trasmissione di file text/plain, tipo quando fai il download, e chiudi brutalmente la connessione con il client

>HttpContext.Current.ApplicationInstance.CompleteRequest();
Fai completare la richiesta saltando all'evento application_endRequest, ma se hai chiuso un attimo prima.........???????????

quindi non capisco come mai vedi la pagina e non solo il file del log

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

alepiaggio83 Profilo | Newbie

L'evento in cui si trova è il click del bottone m_btnUpload.
Il problema è proprio quel Response.Clear() secondo me che pulisce tutto...

Ti posto anche il codice del metodo DisplayMessageBox che viene eseguito ma poi non viene restituito: CommonFunctions.DisplayMessageBox(Page, this.GetType(), l_ErrorMessage);

public static void DisplayMessageBox(Page p_Page, Type p_Type, String p_Message)
{
String l_MessageBoxScript = "<script language=JavaScript> alert(\"" + p_Message + "\"); </script>";

if (!p_Page.ClientScript.IsStartupScriptRegistered("MessageBoxScript"))
{
p_Page.ClientScript.RegisterStartupScript(p_Type, "MessageBoxScript", l_MessageBoxScript);
}
}

Ti dice qualcosa?



Gluck74 Profilo | Guru

si, mi immaginavo che era quello il codice.
Confermo che potrebbe essere porprio il response.clear che non ti fa vedere il messaggio e l'aggiornamento della griglia.
Quello che mi torna strano è che vedi la griglia!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

comunque, se mi spieghi quello che vorresti, vediamo di risolvere


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

alepiaggio83 Profilo | Newbie

Ma anche commentando il Response.Clear() fa lo stesso..
Io vorrei che non influisse sul resto del codice, cioè vorrei vedere in ordine:

- la messageBox che mi dice che il file è stato importato parzialmente a causa di errori in excel
-l'aggiornamento della gridview e contemporaneamente la popup che consente di scaricare il file di log...

Chiedo troppo?:)

Grazie per la pazienza

Gluck74 Profilo | Guru

ok, ora ho capito.
Non puoi includere due scritture sul response assieme, una per la pagina, una per il file di log.
O scrivi la pagina, o scrivi il file di log.
Quello che puoi fare è salvarti il log in session o meglio in cache (se prorpio non vuoi salvarlo come file), e poi nella tua pagina metti:

protected override void OnPreRenderComplete(EventArgs e) { base.OnPreRenderComplete(e); if (l_LogBuffer.Count() != 0) ClientScript.RegisterStartupScript( this.GetType(), "downloadLog", @"window.open( 'download.ashx', 'downloadWindow', 'status=0,toolbar=0,location=0,menubar=0, directories=0,resizable=0,scrollbars=0, height=10,width=10');", true); }

dove download.ashx è un httpHandler che tu farai e ci includi semplicemente il codice del tuo if incriminato.

public void ProcessRequest(HttpContext context) { l_LogBuffer = <lo riprendo da session o da cache> context.Response.ContentType = "text/plain"; context.Response.AddHeader("Content-Disposition", "attachment; filename = LogMessages.txt"); Response.BinaryWrite(l_LogBuffer); }

Non so se è il motodo migliore, ma mi è venuto così ;-))

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

alepiaggio83 Profilo | Newbie

Eccomi!Scusa se rispondo ora ma sono tornata in ufficio adesso, ti ringrazio per esserti interessato così..solamente che sono davvero alle prime armi io e non so che significhi salvarmi il log in cache, puoi aiutarmi anche in questo così poi provo a vedere se funziona?:)
Grazie


Gluck74 Profilo | Guru

http://www.aspitalia.com/articoli/asp.net/cache.aspx
http://www.asp.net/general/videos/how-do-i-use-the-aspnet-cache-object-to-cache-application-information
http://authors.aspalliance.com/aspxtreme/webapps/aspcachingfeatures.aspx
http://msdn.microsoft.com/it-it/library/xsbfdd8c(VS.90).aspx
http://weblogs.asp.net/craigshoemaker/archive/2008/08/28/asp-net-caching-and-performance.aspx

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

alepiaggio83 Profilo | Newbie

Non riesco a farlo, anche perchè la mia l_LogBuffer è una variabile locale che all'interno del metodo che hai scritto non è visibile, dove lo devo mettere il metodo e il gestore evento che hai scritto?scusa sono proprio imbranata ma è davvero poco che scrivo codice...

Gluck74 Profilo | Guru

posta il codice o allega un file

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

alepiaggio83 Profilo | Newbie

Ho allegato il .cs della pagina...grazie:)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5