Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.

Questo articolo ha lo scopo di riassumere brevemente  gli "intoppi" che ho dovuto superare nell'aprire un file di excel da Asp.Net; non si propone quindi come guida "assoluta", pertanto se avete osservazioni o critiche da fare.....fate pure.

Avevo la necessità di aprire un file excel (esistente) per leggerne dei contenuti, e dato che non aveva una forma coerente (per essere letto come connection source), mi serviva ricorrere alla pestifera COMInterop e scandirlo "a mano". Premetto che in questo caso stavo lavorando (ahimè) con VS2003 (ma sinceramente credo che sia identica la storia per il VS2005).

Ormai arrugginito (erano lustri che non leggevo excel da codice...pensate....da vb6!!!! ;-)), dicevo, ormai arrugginito parto dai primi passi, ed aggiungo un riferimento alla "Microsoft Excel 11.0 Object Library" (quindi in VS...Tasto Destro su References > Aggiungi Riferimento > Scelgo nella scheda COM il componente "Microsoft Excel 11.0 Object Library"), e verifico che nel folder References siano stati aggiunti i riferimenti a Microsoft.Office.Core, ed Excel.

Bene, a questo punto mi scrivo una pagina web (WebForm1.aspx) da cui simulare l'upload del file, e una classe (Utilities.cs) che mi gestisca l'interazione con Excel (
oltre a dare altri metodi utili, come il "ShowMessageBox").
Quindi nella classe definisco la mia "public string importPnlFile(string filename)", che provvederà ad aprire il file excel (partecipanti.xls) e prenderà dati a casaccio.
A questo punto iniziano a comparire anche le righe di codice (se volete posso girarvi il sorgente progetto...batsa chiedere...è gratis :-)).

Mi creo le mie variabili del caso (Excel.ApplicationClass, Excel.Workbook, Excel.Worksheet), e le istanzio nel modo seguente:

 

Microsoft.Office.Interop.Excel.ApplicationClass xlsApp= new Microsoft.Office.Interop.Excel.ApplicationClass();
Microsoft.Office.Interop.Excel.Workbook wkb = XlsApp.Workbooks.Open(filename,missing,
false,missing,
    missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing);
Microsoft.Office.Interop.Excel.Worksheet wks = (Microsoft.Office.Interop.Excel.Worksheet)wkb.Worksheets["Info"];

 

Ma già qui salta fuori il primo problema.
Se infatti proviamo ad eseguire queste sole tre righe di codice otteniamo una "System.UnauthorizedAccessException" con message {"Access is denied." }, già alla prima istruzione. Perchè?
Sempre la solita menata dell'utente ASPNET  e delle sue credenziali. Dobbiamo quindi assegnare diritti in più all'utente ASPNET ....già ma dove??? Proprio
nella DCOM Application Microsof.Excel...quindi Start > Administrative Tools > Component Services, nella finestra che otteniamo espandiamo il nodo Component Services sulla sinistra (...consiglio= cliccate sull'immagine, il "+" non basta), quindi espandiamo Computers, e ancora MyComputer, quindi "DCOM Config"; bene, qui dentro cerchiamo
la DCOM Application con nome Microsoft.Excel.Application (ovvio che dovete avere l'Excel installato), chiediamone le proprietà e nella scheda Security, selezionando il Customize facciamo click su Edit ed aggiungiamo nel modo consueto l'utente ASPNET all'elenco, ed assegnamogli pieni diritti (non fatemi scrivere come, ma se avete bisogno chiedete pure).

Bene!!! Fatto questo riavviamo il ns progetto (che vi giro in allegato) e vedremo che riusciamo ora a creare l'istanza dell'Excel.ApplicationClass(),
già, ma, per i più fortunati, alla richiesta di istanza dell' Excel.Workbook, ci imbatteremo in una nuova rogna di tipo "System.Runtime.InteropServices.COMException" che ci lamenta un {"Old format or invalid type library." }. Che ca**o vuole ora sto st****o???? E' un bughettino che Bill (...non proprio lui in persona, eh..) consiglia di risolvere attraverso la CultureInfo (http://support.microsoft.com/kb/320369/en-us), che dovrà essere modificata nel currentThread prima di chiedere l'apertura del file, e reimpostata alla fine dei "lavori". Quindi:

 

//Prima di usare le istanze Excel
System.Globalization.CultureInfo oldCI=System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = 
new System.Globalization.CultureInfo("en-US");
/*
.
.
CODE HERE
.
.*/
//Dopo aver usato le istanze Excel
System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;

 

A questo punto non ci resta che scrivere il codice che ci serve, che in questo esempio aprirà il file excel, leggerà dei dati, ne scriverà, e chiuderà e distruggerà il tutto.
Soprattutto chiuderà e distruggerà...mi raccomando.
Stiamo entrando in Interoperabilità col codice non gestito, quindi cerchiamo di fare le cose per bene con il rilascio degli oggetti, a meno che non vogliate
ritrovarvi decine e decine di processi Excel zombie sulla macchina in questione.
Perche? Perchè gli spazi di memoria dei due mondi (.Net e COM) sono gestiti in modo assolutamente differente (risparmiatemi anche qui la teoria del perchè...cque se occorre chiedete). Quindi bisogna cercare di avere sempre una variabile esplicita di riferimento agli oggetti, e chiederne il rilascio non appena avrete finito di usarla (questo si farà attraverso il metodo System.Runtime.InteropServices.Marshal.ReleaseComObject(object)).
Mi raccomando alla precisione e alle sequenze da rispettare. Nell'esempio proposto le dipendenze seguono il flusso Excel.Range < Excel.WorkSheet < Excel.WorkBook < Excel.Application, è sbagliato quindi finalizzare gli oggetti in un ordine differente (ma tanto ve ne accorgereste ;-D).


Quindi un riassunto di come si presenterebbe ora il codice, con i dovuti commenti:

object  missing  = Type.Missing;

//Prima di usare le istanze Excel
System.Globalization.CultureInfo oldCI=System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = 
new System.Globalization.CultureInfo("en-US");

Microsoft.Office.Interop.Excel.ApplicationClass xlsApp=
null;
Microsoft.Office.Interop.Excel.Workbook wkb = 
null;
Microsoft.Office.Interop.Excel.Worksheet wks =
null;
Microsoft.Office.Interop.Excel.Range rng1=
null;
Microsoft.Office.Interop.Excel.Range rng2=
null;
Microsoft.Office.Interop.Excel.Range rng3=
null;
Microsoft.Office.Interop.Excel.Range rngWrite=
null;

System.Text.StringBuilder sb = 
new System.Text.StringBuilder();

try
{
    xlsApp = 
new Microsoft.Office.Interop.Excel.ApplicationClass();
    xlsApp.Visible=
false;
    
//i parametri indesiderati vanno sostituiti con un object di tipo Type.Missing
    
wkb = xlsApp.Workbooks.Open(filename,missing,false,missing,missing,missing,missing,
        missing,missing,missing,missing,missing,missing,missing,missing);
    
//ottenere l'istanza di un worksheet tramite l'oggetto workbook
    
wks = (Worksheet)wkb.Worksheets["Info"];
    
//sempre...prima di lavorare con uno foglio bisogna attivarlo
    
wks.Activate();
    
//partiamo dalla riga 2 (int iRow=2) per saltare l'intestazione della tabella, 
    //in casi normali si parte dalla 1 (e non dalla 0 come verrebbe naturale. Idem per le colonne).
    
for (int iRow=2;iRow<=36000;iRow++)
    {
        
if (rng1!=null)System.Runtime.InteropServices.Marshal.ReleaseComObject(rng1);
        rng1 = (Range)wks.Cells[iRow,1];
        
if (rng1.Value2==null)
        {
            
break;
        }
        
else
        
{
            
/*Perchè usare l'assegnamento ai range, invece di usare la sintassi più comoda
             * "string xtx = ((Microsoft.Office.Interop.Excel.Range)wks.Cells[iRow,1]).Value2;"?
             *Per evitare che vengano creati riferimenti che non possiamo controllare
             * e quindi processi zombie; infatti, dovremo chiamare 
             * System.Runtime.InteropServices.Marshal.ReleaseComObject(object)
             * per ogni oggetto della gerarchia creato
             *Sembra maniacale, ma vi evita molte rotture*/
            
if (rng1!=null)System.Runtime.InteropServices.Marshal.ReleaseComObject(rng1);
            rng1 = (Range)wks.Cells[iRow,1];
            
if (rng2!=null)System.Runtime.InteropServices.Marshal.ReleaseComObject(rng2);
            rng2 = (Range)wks.Cells[iRow,2];
            
if (rng3!=null)System.Runtime.InteropServices.Marshal.ReleaseComObject(rng3);
            rng3= (Range)wks.Cells[iRow,3];
            
if (rngWrite!=null)System.Runtime.InteropServices.Marshal.ReleaseComObject(rngWrite);
            rngWrite= (Range)wks.Cells[iRow,4];
            
            
/*Il codice non farà altro che leggere l'elenco dei partecipanti dal file
             * aggiornarne i dati relativi alla data di iscrizione (quindi scriviamo in una cella)
             * e restituire l'elenco dei partecipanti da visualizzare con un alert
             * Inutile dirvi che potete provare con qualunqe file, cambiando la logica
             * ed inserendo i dovuti test di validazione dei dati (cosa che io non farò)*/
            
sb.Append(rng2.Value2.ToString()+" " + rng1.Value2.ToString()+
                ", iscritto il "+rng3.Value2.ToString()+"\\r\\n");
            TimeSpan ts = DateTime.Now.Subtract(DateTime.Parse(rng3.Value2.ToString()));
            rngWrite.Value2=ts.TotalDays;
        }
    }
    
if (rng1!=null)System.Runtime.InteropServices.Marshal.ReleaseComObject(rng1);
    
if (rng2!=null)System.Runtime.InteropServices.Marshal.ReleaseComObject(rng2);
    
if (rng3!=null)System.Runtime.InteropServices.Marshal.ReleaseComObject(rng3);
    
if (rngWrite!=null)System.Runtime.InteropServices.Marshal.ReleaseComObject(rngWrite);
    
if (wks!=null)System.Runtime.InteropServices.Marshal.ReleaseComObject(wks);
    
if (wkb!=null)
    {
        wkb.Close(
true,missing,missing);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(wkb);
        wkb=
null;
    }
    
if (xlsApp!=null)
    {
        xlsApp.Quit();
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsApp);
        xlsApp=
null;
    }
    
//CODE HERE
    //Dopo aver usato le istanze Excel
    
System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;    
    
return sb.ToString();
}
catch(Exception e)
{
    
if (rng1!=null)System.Runtime.InteropServices.Marshal.ReleaseComObject(rng1);
    
if (rng2!=null)System.Runtime.InteropServices.Marshal.ReleaseComObject(rng2);
    
if (rng3!=null)System.Runtime.InteropServices.Marshal.ReleaseComObject(rng3);
    
if (rngWrite!=null)System.Runtime.InteropServices.Marshal.ReleaseComObject(rngWrite);
    
if (wks!=null)System.Runtime.InteropServices.Marshal.ReleaseComObject(wks);
    
if (wkb!=null)
    {
        wkb.Close(
true,missing,missing);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(wkb);
        wkb=
null;
    }
    
if (xlsApp!=null)
    {
        xlsApp.Quit();
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsApp);
        xlsApp=
null;
    }
    
if (oldCI != null)System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;
    
return e.Message;
}

 

Siamo quindi alla fine (...finalmente).
Nella pagina web che chiama l'oggetto Utilities, ho inserito due chiamate allo spazzino, per essere davvero certo che non mi rimangano zombies nella macchina; quindi:

 

GC.Collect();
GC.WaitForPendingFinalizers();

 

Questo è quanto. Vi ricordo che avete la possibilità di chiedere un piccolo progetto di esempio, e di fare domande se ne avete.
Spero di essere d'aiuto, e che siate così gentili da lasciarmi un commento per farmi sapere se e quando vi è stato utile questo articolo.
So che non è di chissà quale complessità, ma se vedrò che sono bene accetti i miei articoli, continuerò a scriverne anche su qualcosa di più complesso (...una è già in arrivo..lavoro permettendo sul Net.Remoting).
Ma in linea generale sarà facile che scriva più sulle rotture da perdita di tempo...ma chissà.

THE END

 

Libero Balsamo

http://www.liberobalsamo.net

Print | posted @ martedì 17 luglio 2007 18:25

Comments on this entry:

Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by Victory at 18/07/2007 13:38

Finalmente, grazie davvero chiunque e ovunque tu sia.
Erano giorni che stavo sbattendo come una stupida contro mille scogli,e stavo per abbandonare la cosa. poi per fortuna ho trovato questo articolo (dopo mooolte ricerche nelle lingue più assurde), e con semplicità ho seguito i passi indicati. ora funziona tutto!!! Sono troppo contenta...ti mando un grosso bacio di ringraziamento.

Victory
Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by francesco at 25/07/2007 18:55

MI correggo... era solo un problema di permessi di scrittura sulla cartella. SEI VERAMENTE UN GRANDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Grazie per tutta la vita!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by Libero at 25/07/2007 19:00

;-) Mi fa piacere che tu abbia risolto. Superati gli intoppi di permessi e altre rogne, adesso puoi far fare ad excel quello che vuoi. Spaccalo ;-D.
Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by Libero at 06/12/2007 00:42

Francesco, rileggendo mi sembra di capire cosa stessi provando. Quoto le tre righe che credo ti stiano bloccando.

//oSheet = (Microsoft.Office.Interop.Excel.Worksheet)oWB.ActiveSheet;

oSheet = (Microsoft.Office.Interop.Excel.Worksheet)oXL.Workbooks[oWB];// questo genera l'errore

string nomeFoglio = "oSheet.Name";


In ogni caso non potresti richiedere un'istanza di un worksheet passando un oggetto nullo ad un enumeratore.

Nell'istruzione

oSheet = (Microsoft.Office.Interop.Excel.Worksheet)oXL.Workbooks[oWB];// questo genera l'errore

infatti, tu cerchi di ottenere un worksheet accedendo alla collection Workbooks[] e passando un'istanza nulla di un oggetto Workbook...
diciamo che sei un po' fuori strada.

Per leggere ad esempio i nomi degli sheets (nell'ipotesi tu debba cercare fra i vari fogli quello che ti interessa) devi ciclare nella collection dei worksheets e chiederne la property .Name.
Un'esempio:

foreach (Worksheet wks in wkb.Worksheets)
{
//verificare il nome del foglio
if (wks.Name=="Nome_Foglio")
{

//quindi lo attivo per usarlo
wks.Activate();
//eseguo le operazioni che necessitano
}
//Al termine DEVO necessariamente rilasciare l'istanza..pena..zombies a volontà
System.Runtime.InteropServices.Marshal.ReleaseComObject(wks);
}

Se invece conosco già il nome del foglio, lo istanzio nel seguente modo:

Workbook wkb = xlsApp.Workbooks.Open(filename,missing,false,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing);

Worksheet wks = (Worksheet)wkb.Worksheets["Info"];
//quindi lo attivo per usarlo
wks.Activate()



HOPE IT HELP

Gravatar # www.liberobalsamo.net
by Pingback/TrackBack at 12/01/2008 09:13

www.liberobalsamo.net
Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by Libero at 12/05/2008 02:41

Alessandro,
per ora mi viene in mente solo questo.

Il problema della globalizzazione è noto e lo risolvi forzando la culture prima di utilizzare qualunque metodo degli Excel.ApplicationClass

//Prima di usare le istanze Excel
System.Globalization.CultureInfo oldCI=System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

Quello che mi viene in mente, se non l'hai fatto, è di icludere queste due righe di codice in testa, e di passare come 'missing' anche l'ultimo parametro...almeno per capire se possa essere quello il problema di tutto. Nella tua chiamata all'Open(), infatti, gli passi un Microsoft.Office.Interop.Excel.XlCorruptLoad.xlRepairFile. il mio suggerimento è di dargli un Missing.Value anche lì.

Prova.
Purtroppo non ho una macchina Vista su cui provare il tuo codice..per cui posso solo andare per supposizioni.

La seconda ipotesi è di guardare in rete eventuali limitazioni sulle modalità di accesso a librerie COM in Vista. Vorrai mai che sia il celeberrimo "senso della security" di Vista che ti manda alla frutta.

Facci sapere,
Libero
Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by alessandro at 12/05/2008 03:32

per quanto riguarda l'ultimo parametro della open prima era missing.value come suggerito da te ...

poi cercando una soluzione per questo problema ho letto che potrebbe trattarsi di un errore con i file corrotti e suggerivano di mettere xlRepairFile ... ma niente :D

per il resto ... ora provo :D
grazie
Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by Alessandro at 12/05/2008 23:18

non riesco ad aprire neanche un file excel nuovo.
le excel library usate sono alla versione 11.

ora provo il fileformatconvertes.exe

e per quanto riguarda la tiritera .. non ho fatto tutto .. ma solo quello che pensavo potesse essere utile ...

ora magari rileggo e riprovo un po tutto.

grazie cmq per la disponibilita', e speriamo bene
Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by alessandro at 12/05/2008 23:39

con fileformatconvertes niente :(
Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by Libero at 13/05/2008 00:35

Alessandro...non ho altro da suggerirti per ora, se non di lavorare di PInvoke.

Prima però ti direi di provare ad utilizzare il codice che propongo come esempio di quest'articolo.

Ti creeresti quindi una nuova solution, e copi ed incolli il codice che suggerisco io su.

Prova in questo modo, segui passo per passo l'articolo, così almeno puoi capire se c'è qualcosa che non va nella tua attuale configurazione, o è davvero la tua combinazione di elementi (vista, ms off.2003 etc etc) che spacca.

Ti consiglierei anche di dare un'occhiata all'EventViewer per avere maggiori dettagli su quanto sta succedendo. Se trovi qualcosa nell'EV postala pure. Se posso ti do una mano.

I'm waiting for your news,
Libero
Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by alessandro at 13/05/2008 04:45

come non detto...
mentre cercavo il Component Services (che sembra che su Vista non ci sia .. o è ben nascosto) .. ho trovato l'EventViewer di windows

ma non so che farci .. ora ci gioco un po :D

ps.
visto che sono un po incasinato a lavoro ..
"(se volete posso girarvi il sorgente progetto...batsa chiedere...è gratis :-))"

se hai a portata di mano un codice gia fatto ben venga
la mia mail è "axel.82@tele2.it"

grazie mille
Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by alessandro at 13/05/2008 04:50

come non detto di nuovo ..
dopo 2min di google .. ho trovato anche il component services ..

per ki lo cerca su vista..

"
If you do not have Run on your Start Menu, you can click on Start > All Programs > Accessories > Command Prompt. This would launch the Command Prompt where you can type c:\windows\system32\comexp.msc and press Enter to launch the Component Services Manager :-)"

Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by Libero at 13/05/2008 04:55

Piccola matricola impertinente...e anche un po' rompipa**e ;-).

Va bene adesso ti giro un progetto.

Libero
Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by Libero at 13/05/2008 04:59

Tieni, segui il link

http://www.liberobalsamo.net/downloads/articoloexcel.zip

Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by alessandro at 13/05/2008 05:30

ok grazie ..
nel frattempo ...

per quanto riguarda i pieni permessi all utente ASPNET
..
credo che ti riferisci all'utente SYSTEM per .net 1
e NETWORK SERVICE per .net 2
che sono gia confinurati a pieni permessi :(


Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by alessandro at 13/05/2008 05:37

The machine-default permission settings do not grant Local Activation permission for the COM Server application with CLSID
{000C101C-0000-0000-C000-000000000046}
to the user NT AUTHORITY\NETWORK SERVICE SID (S-1-5-20) from address LocalHost (Using LRPC). This security permission can be modified using the Component Services administrative tool.

da event viewer
Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by Libero at 13/05/2008 05:49

ecco appunto...seghe di security di vista. Devi smanettare un po' nel componente dcom della libreria excel e concedere i grant all'utente <<macchina>>\ASPNET (Asp.Net machine account). Non ho presente cos'altro si possa configurare in vista a livello di componente com...comunque la strada da seguire è questa (come già ti ho suggerito all'inizio).

Dell'utente... ti rispondo anche al post precedente....ribadisco l'espressione "assegnare pieni permessi all'utente ASPNET". Se stai lavorando con un website, è di quest'utente che ti devi preoccupare.

Libero
Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by alessandro at 13/05/2008 06:40

ho trovato cio' che intendevi te.
ho trovato l'account ASPNET

e da Componen Services, in DCOM Config, in Microsoft Excel Application, sono riuscito ad aggiungere l'account ASPNET dando pieni privilegi ...

ma dai log di EventViewer, l'id 10016 da sempre l'errore ...


The machine-default permission settings do not grant Local Activation permission for the COM Server application with CLSID
{000C101C-0000-0000-C000-000000000046}
to the user NT AUTHORITY\NETWORK SERVICE SID (S-1-5-20) from address LocalHost (Using LRPC). This security permission can be modified using the Component Services administrative tool.



Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by Libero at 13/05/2008 06:57

alessandro... leggi cosa ti sta dicendo

"The machine-default permission settings do not grant Local Activation"

Il passo dell'utente asp.net era un "must to" che ti tornerà utile DOPO aver risolto il problema di security.

Mi sembra evidente che Vista abbia dei settaggi di default che impediscono di eseguire componenti com da parte (secondo me) di iis, o di altri account macchina (nel tuo caso guarderei il "network service sid").

Nei settaggi del componente, devi verificare, nelle varie schede, se c'è qualcosa di significativo riguardo all'activation, ed assegnare pieni diritii anche all'utente iis, ed agli altri utenti che volta per volta ti verranno segnalati come impossibilitati all'accesso (sempre attraverso l'EventViewer).

Comunque, ti ripeto, che è evidente che sia un problema di security di vista....devi cercare in quella direzioneeee...googla con parole chiave...e trovi qualcosa (http://www.codeproject.com/KB/aspnet/Component_Service_and_IIS.aspx)

So che chiedere è più facile...ma non puoi sperare che gli altri ti risolvano "TUTTO"...metti un po' in funzione anche la deduzione, la logica e l'inventiva. Non te la prendere...ma io preferisco l'approccio self-made e non cry-at-mummy.

Dai, fammi sapere se riesci a risolvere.
Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by giuseppe at 16/09/2010 20:05

grazie per le spiegazione è molto utile.
Io ho realizzato un applicativo che crea un'istanza excell.
Funziona tutto in locale ma da remoto non funziona.
Sto impazzendo penso sia un problema di autorizzazione ma on riesco ad uscirne.

Gravatar # re: Usare Excel da ASP.NET...piccoli litigi con Access is denied, Old format or invalid type library, e zombies.
by Francesco at 06/09/2013 20:27

Questo è il mio codice:

//Prima di usare le istanze Excel
System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

object oMissing = System.Reflection.Missing.Value;

Excel.ApplicationClass wExcel = new Excel.ApplicationClass();
wExcel.DisplayAlerts = false;
Excel.Workbooks wBooks = wExcel.Workbooks;
Excel.Workbook wBook = null;

string wPath = Server.MapPath("~/Templates") + "\\EnelDSS.xlsm";

wBook = wBooks.Open(wPath, oMissing, false, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);

wBook.Close(false, oMissing, oMissing);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wBook);
wBook = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(wBooks);
wBooks = null;
wExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(wExcel);
wExcel = null;

GC.Collect();

//Dopo aver usato le istanze Excel
System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;
Comments have been closed on this topic.