2010-09-02 21 views
0

Récemment déployé mon application Web sur Windows Server 2008, IIS7 (avec Office installé).Comment faire pour exceler Interop sur Windows 2008?

Après avoir chassé (& attraper) diverses autres erreurs, je fais face à un je ne sais pas par où commencer. Sur Cassini (serveur visuel de développement de studio) tout fonctionnait parfaitement (lecture excel à travers excel interop).

Sur W2008 IIS il jette une erreur vague:

Value cannot be null. Parameter name: o

[ArgumentNullException: Value cannot be null. Parameter name: o] System.Runtime.InteropServices.Marshal.FinalReleaseComObject(Object o) +9430474 longnamespace.ExcelReader.Dispose() in c:\longpath\ExcelReader.cs:23 longnamespace.ApplicationFormReader.Read(String path) in c:\longpath\ApplicationFormReader.cs:32

Actuellement, je vais ajouter chèque nul et voir si les choses vont mieux, mais je ne soupçonne qu'il souffle juste et dispose sur finally bloc avant il commence même à lire n'importe quoi.

Essayé de définir le pool d'applications à exécuter sous le système local, mais cela n'a rien changé.

Des idées?


Voici comment la méthode Éliminez ressemble

//http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects-in-c/159419#159419 
    public void Dispose(){ 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     Marshal.FinalReleaseComObject(_ws); //Worksheet, line 23 
     _wb.Close(); 
     Marshal.FinalReleaseComObject(_wb); //Workbook 
     _ap.Quit(); 
     Marshal.FinalReleaseComObject(_ap); //Application 
    } 

Je crois que cet événement est lié

The machine-default permission settings do not grant Local Activation permission for the COM Server application with CLSID {00024500-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.

Si oui - tout le monde pourrait se traduire?

Ajout de droit pour Microsoft Excel Application à Network service dans les services de composants en quelque sorte ne fonctionnait pas. genre a.

La suppression du niveau d'authentification n'a pas aidé non plus.


Changé à

if (_ws != null) 
    Marshal.FinalReleaseComObject(_ws); 
    if (_wb != null) 
    { 
    _wb.Close(); 
    Marshal.FinalReleaseComObject(_wb); 
    } 
    if (_ap != null) 
    { 
    _ap.Quit(); 
    Marshal.FinalReleaseComObject(_ap); 
    } 

nous allons voir comment ça se passe ...

Répondre

2

L'exception semble assez simple: à la ligne 23 dans votre code que vous appelez Marshal.FinalReleaseComObject, passer un null référence.

Donc, _ws, _wb ou _ap est une référence nulle. Vous serez en mesure de voir lequel si vous recherchez la ligne 23.

Pour résoudre ce, testez null avant d'appeler FinalReleaseComObject.

Le GUID {00024500-0000-0000-C000-000000000046} référencé dans votre événement est Excel - comme vous pourrez le voir avec RegEdit.

Ce que je soupçonne est que le code que vous n'avez pas publié et qui essaye d'instancier un objet Application Excel (_ap?) Lance une exception en raison d'une autorisation insuffisante. Puis, parce que votre méthode Dispose ne vérifie pas que _ap est nul, elle renvoie à nouveau là.

Je suppose que vous êtes sur la bonne voie lorsque vous souhaitez donner l'autorisation Local Activation au compte Service réseau. Vous ne savez pas pourquoi cela ne fonctionne pas, peut-être que vous devez redémarrer ou redémarrer IIS?

MISE À JOUR Excel Interop n'est pas recommandé dans les applications serveur. Il est préférable de manipuler les documents Excel d'une autre manière, par ex. en utilisant un composant tiers tel que Aspose. Une chose dont je me souviens est qu'Excel doit s'exécuter sous un compte disposant d'un profil local, ce qui peut ne pas être le cas pour le compte Service réseau. Donc, l'exécuter sous un compte différent comme vous l'avez mentionné dans le commentaire pourrait être la meilleure solution si vous avez besoin d'utiliser Excel Interop.

+0

Chose étrange est - pourquoi il est nul s'il n'a jamais été avant le déploiement sur IIS? :/ –

+0

Commuté à un utilisateur particulier comme une identité dans les paramètres dcom et il a finalement travaillé. Dieu que je suis fatigué ... Toute la journée à lutter contre les problèmes de bullc ** p comme celui-ci. Il est temps de rentrer à la maison. Et merci pour votre temps. –

+0

"Chose étrange est - pourquoi il est nul s'il n'a jamais été avant le déploiement sur IIS?" - probablement parce que l'autre code qui n'a pas été posté instancie avec succès l'objet _ap avant de le déployer sur IIS. – Joe