Strano problema il caricamento di un report

lunedì 28 luglio 2008 - 11.35

lukepet Profilo | Junior Member

Ho una strana situazione che mi è capitata gestendo la stampa di un report.

Dunque, ho una pagina aspx (pagina1.aspx) al cui interno ho inserito un button per la stampa di un report. Cliccando sul button viene infatti richiamata una funzione javascript "window.open" che apre una nuova pagina aspx (pagina2.aspx) che contiene il report.

Il report deve stampare delle informazioni riportate in pagina1.aspx, la cosa strana però è che queste informazioni vengono stampate solo al secondo click; la prima volta che stampo il report infatti non si vedono i dati, mentre se clicco una seconda volta si.

Per fare una prova ho inserito un msgbox nel Page_Load di pagina2.aspx e la cosa strana è che anche il messaggio contenuto nel msgbox viene stampato una volta si e una volta no. Sembra proprio che quando si clicca una prima volta le istruzioni inserite nel Page_Load non vengano eseguite!

Da che cosa può dipendere questa cosa?

E' piuttosto strano questo comportamento...avete qualche idea in proposito?

Grazie in anticipo per ogni suggerimento.

freeteo Profilo | Guru

ciao,
il fatto che tu usi un windows.open non cambia niente lato server, quindi lato "report" diciamo, infatti viene cmq fatta la chiamata dal tuo browser a quella pagina, solamente che in una finestra nuova.
Tieni presente che alcune protezioni avanzate potrebbero non farti funzionare questo codice js, meglio se usi un link "<a ..></a>" normale con target="_blank".


>Sembra proprio che quando si clicca una prima volta le istruzioni inserite nel Page_Load non vengano eseguite!
questo non è possibile, non funziona così la pipeline di asp.net, il page_load viene sempre eseguito, potrebbe essere un problema di report come di codice.

Prova a postare un po di codice, così possiamo analizzare dove sta il problema.
Grazie.


* ps: per i problemi di report, indipendentemente se di asp.net o windowsForm, usa pure la stanza apposita.
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

lukepet Profilo | Junior Member

ok, dunque...

dalla pagina1.aspx io richiamo la pagina 2 in questo modo:

Dim proprieta As String = "left=10, top=10, height=650, width=1000, resizable=yes, scrollbars=yes"
ScriptManager.RegisterStartupScript(Me, Me.GetType(), "Commissione", "window.open('../private/Pagina2.aspx','_blank',""" & proprieta & """,true);", True)

mentre nella pagina 2 il report viene creato e stampato con queste istruzioni:

Dim reportType As String = "PDF"
Dim mimeType As String = Nothing
Dim encoding As String = Nothing
Dim fileNameExtension As String = Nothing

Dim deviceInfo As String = _
"<DeviceInfo>" + _
" <OutputFormat>PDF</OutputFormat>" + _
" <PageWidth>11.7in</PageWidth>" + _
" <PageHeight>8.5in</PageHeight>" + _
" <MarginTop>0.2in</MarginTop>" + _
" <MarginLeft>0in</MarginLeft>" + _
" <MarginRight>0in</MarginRight>" + _
" <MarginBottom>0in</MarginBottom>" + _
"</DeviceInfo>"

Dim warnings() As Warning = Nothing
Dim streams() As String = Nothing
Dim renderedBytes() As Byte

rep.Refresh()

renderedBytes = rep.Render( _
reportType, _
deviceInfo, _
mimeType, _
encoding, _
fileNameExtension, _
streams, _
warnings)

Dim nomefilePDFCommissione As String = "Commissione_"
Response.Clear()

Response.ContentType = mimeType

Response.AddHeader("content-disposition", "attachment; filename=" & nomefilePDFCommissione & "." & fileNameExtension)
Response.BinaryWrite(renderedBytes)

Response.End()

come potrei gestire la cosa in maniera migliore?

freeteo Profilo | Guru

ciao,
si il codice sembra giusto, renderizzi il report senza passare per il viewer e lo dai in streaming giù sul client...non dovrebbero esserci problemi.
Non è che sia il browser stesso che non carica il file perchè lo trova uguale a quello già scaricato prima?

Prova a mettere nella pagina un header che inibisca la cache dei browser:
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
o
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">


* ps: per i problemi di report, indipendentemente se di asp.net o windowsForm, usa pure la stanza apposita.

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

lukepet Profilo | Junior Member

Comincio a sospettare anch'io che dipenda da qualche comportamento particolare del browser...infatti non si spiega che un MsgBox inserito all'inizio del Page_Load venga stampato una volta si ed una volta no.

Ho provato ad inserire i tag che mi hai suggerito nell'head di pagina2.aspx ma niente da fare...hai qualche altro suggerimento?

freeteo Profilo | Guru

se debugghi cosa succede? il render del report ha i byte rimepiti correttmente?
Intendo che mettti un punto di debug, e alla chiamata dal broeser si ferma li, e magari lo salvi al volo da dentro alla finestra "Watch" su un file temporaneo e lo apri con Acrobat per vedere se è corretto invece di darlo in output...

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

lukepet Profilo | Junior Member

qua la cosa si fa sempre più strana...

Con un punto di debug il programma si ferma una volta si ed una no sul quel punto. Infatti succede che una prima volta il pdf viene stampato senza che il debug venga eseguito mentre al secondo click il punto di debug viene riconosciuto.

Bo, inizio a non capirci niente...più tardi faccio qualche altra prova.

freeteo Profilo | Guru

ciao,
riesci a simulare la cosa con un report d'esempio e allegarmi un progetto? così faccio delle prove anche io e vediamo di capirci qualcosa...

Il concetto cmq rimane, deve passare ogni volta viene chiamata la pagina, sia che sia un "Load" normale per una chiama da browser che un postback, dato che l'HTTP è un protocollo passivo e deve richiedere la pagina al server quando viene fatto il postback della stessa, facendo ripassare la pipeline per il load...non c'è un " if (! IsPostBack) ..." almeno così mi sembrava...

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

lukepet Profilo | Junior Member

non ci crederai ma ancora sto lottando con questo problema...

ho trovato un post che parla dello stesso problema ma ancora devo testare la soluzione proposta: http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3679537&SiteID=1

freeteo Profilo | Guru

>non ci crederai ma ancora sto lottando con questo problema...
riesci a mandarmi un progettino di test che posso testare anche io nella mia macchina? casomai crealo, mettici un db temporaneo con qualche dato di test in modo che possa analizzare meglio


>ho trovato un post che parla dello stesso problema ma ancora
>devo testare la soluzione proposta: http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3679537&SiteID=1
la risposta che riceve in questo post però parla di un report "pubblicato" quindi con un ReportServer, e non integrato direttamente in un'applicazione...tu sei in questa condizione?
In poche parole hai un file "RDL" che pubblichi nel server di report o sei dentro ad un'applicazione web ed hai un file RDLC?
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

lukepet Profilo | Junior Member

Hai ragione, io ho un file rdlc.

Se riesco, cerco di mandarti un progetto di prova...ti preparo una soluzione ripulita e proverò a mandartela (se riesco).

La pagina fa parte di un progetto piuttosto articolato quindi devo capire quanto sia fattibile la cosa...ci proverò.

lukepet Profilo | Junior Member

Finalmente sono riuscito a risolvere!

Il problema è nella chiamata javascritp window.open...

Dim proprieta As String = "left=10, top=10, height=650, width=1000, resizable=yes, scrollbars=yes"
ScriptManager.RegisterStartupScript(Me, Me.GetType(), "Commissione", "window.open('../private/Pagina2.aspx','_blank',""" & proprieta & """,true);", True)

mi sono reso conto che avevo cambiato il target da _blank a _self e questo ha creato i problemi di visualizzazione...anche se sinceramente ancora devo capire come mai.

Comunque, rimettendo il target a _blank sembra che tutto sia ritornato in funzione. Speriamo bene.


freeteo Profilo | Guru

mmmm che strana questa cosa, forse sei dentro ad un frame, e siccome quando renderizza sul web usa anche lui gli iframe, potrebbe si avere qualche problema.

Puoi verificare come costruisce l'output html con tool tipo "Developer Toolbar" di Internet Explorer, o meglio ancora -"Firebug" per Firefox, che ti permettono di visualizzare (e modificare) in maniera intelligente le pagine web che hai aperto nel browser...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5