Errore:

venerdì 09 luglio 2010 - 14.32

franco.geko Profilo | Junior Member

Ciao a tutti.
Ho il seguente problema:
Ho creato un web service con un metodo che crea un Report con dati estratti da un db sql server 2005 e lo invia per email in formato PDF.
Ho utilizzato Visual Studio 2005 con relativo Crystal Report.
Il web service risiede su un server Windows 2003 sul quale ho installato il Web runtime per Crystal Report

Ora il problema è che tale web service funziona per un po', a volte ore, a volte giorni poi dà il seguente errore:
<<Exception Logon failed.
Error in File C:\WINDOWS\TEMP\rReintegro {A7E14CB9-2BDC-49DA-A653-5E70CF833797}.rpt:
Unable to connect: incorrect log on parameters.>>

Il bello è che riavviando il server, ricomincia a funzionare per un po' !

Il web service viene utilizzato da dispositivi mobili che utilizzano l'accesso anonimo in IIS con l'impersonificazione di un utente autenticato

La connessione del web service al database si trova nel web.config del server stesso ed utilizza un utente amministratore (per testarlo...poi userò un altro utente)

L'ultimo estratto di codice che uso è il seguente...

cryRpt = New ReportDocument
Dim crTableLogonInfo As New TableLogOnInfo
Dim crConnectionInfo As New ConnectionInfo
Dim crTables As Tables
Dim crTable As Table

cryRpt.Load(Server.MapPath("rReintegro.rpt"))
With crConnectionInfo
.ServerName = "SERVERNAME"
.DatabaseName = "DATABASE"
.UserID = "sa"
.Password = "PASSWORD SA"
.IntegratedSecurity = False
End With
crTables = cryRpt.Database.Tables
For Each crTable In crTables
crTableLogonInfo = crTable.LogOnInfo
crTable.LogOnInfo.ConnectionInfo = crConnectionInfo
crTable.ApplyLogOnInfo(crTableLogonInfo)
Next

With cryRpt
.SetDataSource(dsToPrint)
.Refresh()
.SetParameterValue("DescrizioneOperatore", CurrentOp.NomeOperatore)
End With
.....etc etc...
[Edit]
ho fatto 30, facciamo 31 col resto del codice ;)

'Se stampa su PDF
Dim Pdf As Boolean = System.Configuration.ConfigurationManager.AppSettings("pdf")

If Pdf Then
vPath = System.Configuration.ConfigurationManager.AppSettings("print_path_pdf")
If Not Directory.Exists(vPath) Then vPath = "C:\"
vPDFFileName = vPath & CStr(Operatore).Trim & ".pdf"

'Se esiste il file lo cancelliamo
If File.Exists(vPDFFileName) Then File.Delete(vPDFFileName)
Dim excelFormatOpts As New CrystalDecisions.Shared.ExportOptions
Dim diskOpts As New DiskFileDestinationOptions
diskOpts.DiskFileName = vPDFFileName
cryRpt.ExportOptions.DestinationOptions = diskOpts
cryRpt.ExportOptions.ExportDestinationType = ExportDestinationType.DiskFile
cryRpt.ExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat
cryRpt.Export()
end if
[End Edit]

Dall'ambiente di sviluppo con IIS sulla macchina di sviluppo funziona sempre e comunque.
:(

Qualche idea? io per ora dopo 2 giorni spesi in prove varie le ho terminate...:(

Grazie dell'attenzione
Franco

freeteo Profilo | Guru

Ciao,
quindi stai dicendo che il tuo applicativo funziona per un po' e poi smette di funzionare per sempre?
Oppure va e non va in maniera intermittente (random)?

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

franco.geko Profilo | Junior Member

Ciao Matteo,
quando smette lo fa per sempre.
L'unico modo perchè funzioni di nuovo è riavviando il server (che per problemi di tempo, come al solito, ora è il server di produzione )
Inoltre quando smette, smette per tutti, nel senso che sia i dispositivi mobili, sia il mio applicativo desktop di test, sia richiamandolo direttamente dal browser del server non va più.

L'errore è proprio nella creazione del pdf da parte di Crystal Report dato che lo step precedente è la creazione di un file Excel da una query di SQL Server e funziona perfettamente.

:(

Ciao
Franco

freeteo Profilo | Guru

Ciao,
forse rimane appeso l'oggetto "cryRpt", prova a fare il Dispose() quando esci dal metodo ed ha creato il pdf.

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

franco.geko Profilo | Junior Member

Matteo,
scusa, non ho postato il resto del codice, errore mio.
Il codice postato era in un Try che finisce con un

Catch ex as exception
msgbox ex.message
finally
cryRpt.Dispose()
end try

ciao
Franco

freeteo Profilo | Guru

Ciao,
forse potrebbe anche essere qualcosa sulle impostazioni di registro di Crystal, tipo il maximum number of process, come mostrato qui:
http://social.msdn.microsoft.com/forums/en/vscrystalreports/thread/208525b2-94cd-4af6-9c5a-015e243b3092/


Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

franco.geko Profilo | Junior Member

Grazie per la dritta, Matteo.
Ora è qualche giorno che funziona senza fermarsi...
Il ws in oggetto era un "vecchio" ws fatto con VS2003 e che 'pescava' i dati da 2 database, in prevalenza dal database A.
Ho riscritto completamente l'SQL principale del report pescando i dati solo da B.
nel file web.config la connessione veniva effettuata su A e nella Select il riferimento alle tabelle era con percorso assoluto ("Select campo1,campo2..campoN from A.dbo.nome_tabella").
Ora ho cambiato la connessione facendola puntare direttamente al database B e ho tolto il riferimento assoluto alle tabelle della Select principale, mantenendolo però per quelle ausiliarie.

Lo dico sottovoce ma per ora sembra funzionare...:)

Grazie di tutto

Ciao
Franco

franco.geko Profilo | Junior Member

Nulla da fare.
Ho parlato troppo presto. Ha smesso di funzionare ancora. :(
Ora ho bisogno di una soluzione al volo per generare un report PDF tramite web service e inviarlo via email...il processo deve essere gestito interamente dal WebService e non dal client che chiama il WS.

Nel senso che il consumatore del webService è un dispositivo mobile che alla fine della giornata lavorativa e dopo l'ultima sincronizzazione di database, deve mandare una picking list al magazzino (in pdf)...

Idee?

Grazie
Franco

freeteo Profilo | Guru

Ciao,
hai valutato SqlReporting? Io lo trovo molto veloce, snello e abbastanza vicino alle funzionalità che hai con Crystal.
http://www.gotreportviewer.com/
http://msdn.microsoft.com/en-us/library/ms159253(SQL.90).aspx
http://www.microsoft.com/sqlserver/2008/en/us/reporting.aspx

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

franco.geko Profilo | Junior Member

Grazie Teo.
In effetti ci ho pensato..il problema è che non saprei come fare in modo che il file di esportazione sia creato direttamente sulla macchina su cui risiede il WS (il server IIS per intenderci).
Di solito nei programmi che uso il Client è una Windows Form che richiama il ws e che crea il file PDF con il metodo "render" che restituisce un FileStream.
In questo caso i client sono dei PocketPC connessi in GPRS, e non vorrei salvare il PDF sul palmare per poi "restituirlo" al server da inviare...
non so se mi sono spiegato...

La mia intezione sarebbe quella di richiamare un metodo del webservice che crei il report in pdf sul server e lo invii per email...

Grazie
Franco

freeteo Profilo | Guru

Sì certo, infatti è la cosa corretta da fare quella di lavorare il più possibile sul server dove appunto puoi "centralizzare" le varie funzionalità.
Infatti ti dicevo sqlREporting come spunto proprio per questo motivo, ossia lo metti dentro a qualche metodo del WebService che fa tutto il lavoro, a differenza di Crystal è più leggero e non dovrebbero esserci limitazioni di esecuzione su server.

Il codice è abbastanza semplice, è un metodo "Render" al quale passi il formato e ti fai tornare lo stream sottoforma di byte[] e poi ne fai quello che vuoi, un ad esempio con un codice di questo tipo:
ReportViewer viewer = new ReportViewer(); LocalReport report = viewer.LocalReport; report.ReportPath = "...fullpath del file report..."; report.DataSource.Add( new ReportDataSource("...nome...", ...dati...) ); //---queste ci vogliono string mimeType; string encoding; string fileNameExtension; string[] streams; Warning[] warnings; string deviceInfo = "<DeviceInfo>" + "<PageHeight>29cm</PageHeight>" + "<PageWidth>21cm</PageWidth>" + "</DeviceInfo>"; byte[] bytes = report.Render(format, deviceInfo, out mimeType, out encoding, out fileNameExtension, out streams, out warnings); ...

se vuoi altre info trovi in internet e nei link che ti ho dato prima.

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

franco.geko Profilo | Junior Member

Grazie mille Teo!!
Farò così :)

Ciao
Franco

freeteo Profilo | Guru

>Grazie mille Teo!!
>Farò così :)
ok, ricorda che devi avere installato il runtime sul server dove gira quel webservice, ti basta prenderlo da microsoft:
http://www.microsoft.com/downloads/details.aspx?familyid=8a166cac-758d-45c8-b637-dd7726e61367&displaylang=en
il link è per la versione 2005, c'è anche quello per la 2008 vedi tu quello che preferisci a seconda anche di che versione hai usato per disegnarlo...

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
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