7
votes

Obtenir une erreur de référence d'objet dans Prod When pour essayer d'utiliser le mot documentClass

J'écris un programme qui utilise un gabarit .Dotx et fait une fusion de données dans une page ASPX. Le programme fonctionne parfaitement sur mon poste de travail de Dev localement, mais lorsque je le déploierai sur un serveur IIS de test, il échoue sur la deuxième ligne ci-dessous me donnant une erreur de référence d'objet.

J'ai rencontré des problèmes plus tôt car le mot que le mot com n'était pas sur Le serveur IIS a donc chargé Word sur le serveur et définissez la permission dans DCOM et a passé au-delà de ce problème. Mais maintenant, je reçois cette erreur sur la ligne qui commence par wrange = .....

Comme je l'ai dit, le programme fonctionne parfaitement localement en mode de débogage.

Toutes les idées? < / p> xxx

lignes de code: xxx


2 commentaires

Explication probable: Word n'est pas installé sur le serveur?


Oui, Word est définitivement installé sur le serveur. J'ai rencontré un problème différent plus tôt et j'ai trouvé que j'avais besoin de l'installer, il y a donc été là. En fait, je devais modifier les autorisations sur Microsoft Word dans DCOM dans les services Component pour passer au-delà d'une erreur refusée.


4 Réponses :


0
votes

Si Word est réellement installé sur le serveur Vérifiez si le compte d'utilisateur où IIS est exécuté sous la direction de l'assemblage Microsoft.Office.interop


1 commentaires

Les autorisations de Microsoft.Office.Interop Assembly.Interop partout partout mais dans les services des composants? Ceci est ma première tentative d'imprimer la fusion de l'exécution d'une page ASP.NET, alors je vole des aveugles en ce moment.



-3
votes

Votre programme pas fonctionne localement en mode de débogage. Vous n'avez tout simplement pas exercé de bugs.

Vous devriez JAMAIS , dans aucune circonstance, utilisez l'une des API de bureau de bureau d'une application ASP.NET ou de toute autre application de serveur. Ces API sont conçues comme des appels vers une application interactive et de bureau. Beaucoup d'hypothèses qu'elles établissent ne s'appliquent pas aux applications de serveur.

Par exemple, une application de bureau est synchronisée par les actions de l'utilisateur devenant des messages dans la file d'attente du message Windows. Il n'y a pas de file d'attente de messages Windows dans votre application ASP.NET, l'accès aux données partagées n'est pas synchronisé. Vos tests peuvent simplement ne jamais avoir causé de multiples threads à courir en même temps.

Il peut y avoir des données qui n'existent en une seule copie pour tous les utilisateurs d'un composant COM donné. Cela fonctionne bien dans une application de bureau, car il est est un seul utilisateur. Votre application ASP.NET contient de nombreux utilisateurs tous en exécutant le code en même temps. Une autre hypothèse violée.

Toutes ces choses produiront des bugs subtils qui ne peuvent pas être résolus. Ils ne peuvent être déplacés que, vous laissant penser que vous avez résolu le problème, jusqu'au moment où vous réalisez qu'il y a un autre problème. Ce cycle ne finit jamais et jamais ne peut la fin, car vous n'aurez pas résolu le problème réel: le problème était que vous utilisiez une API d'automatisation de bureau à partir d'une application serveur.

correction que le problème , et vous n'aurez plus de bugs de ce type.


P.s. Il arrive également que vous puissiez enfreindre votre licence pour Microsoft Word, à moins que tous les utilisateurs de votre application ASP.NET ne disposent de licences pour l'application Word.


14 commentaires

Je suis confus par le commentaire ci-dessus que mon programme ne fonctionne pas localement en mode de débogage. Je clique sur le bouton et le code s'exécute, le mot doc s'ouvre et fusionne les données et le document est affiché correctement afin que cela fonctionne et je suis en débogage, veuillez expliquer.


@RJ: Lorsque vous cliquez sur le bouton et que le code s'exécute, le document Word s'ouvre, etc., vous avez effectué un ensemble de chemins de code qui fonctionnent. Vous l'avez fait en ne testant pas tous les chemins de code qui ne fonctionnent pas.


Il s'agit d'un environnement contrôlé avec seulement quelques utilisateurs qui ont tous installé Office 2007 sur leurs postes de travail afin de ne pas violer la licence. Cependant, c'est un bon point que vous faites et quelque chose qui doit être pris en compte. Je suis d'accord avec votre déclaration sur la licence. Bon point!


@RJ: La licence est la plus petite question et le plus facile à résoudre. Votre application est fondamentalement brisée et ne sera jamais fixée avant d'arrêter d'appeler ces API d'ASP.NET.


John: Comme je l'ai dit ci-dessus, c'est ma première tentative de faire cela. Mon autre pensée était de faire une application Windows et de faire un déploiement en un clic sur les postes de travail utilisateur. Peut-être que vous pouvez me donner quelques conseils si vous avez déjà fait quelque chose comme ça avant. Mon objectif est d'avoir une application qui utilise une sorte de modèle pour imprimer des lettres, des formulaires, etc. à l'aide de données fusionnées. Que feriez-vous dans ce cas? Peut-être que je devrais poster une autre question à ce sujet.


@RJ: Oui, postez une autre question et faites-vous référence celle-ci. Vous ne voulez pas faire cela avec ASP.NET.


@John Saunders: Ce fut une bonne réponse jusqu'à ce que je reçois la supposition des licences. C'est probablement une meilleure idée de diriger quelqu'un à un spécialiste de la licence dans SMSP ou EPG / CS / PS avant de mettre une crevaison de la CLUFE dans aucune raison apparente. Sur la partie "assez bonne" ci-dessus, notez que pendant que votre conseil est solide, je pense que ce que vous voulez dire de dire est "l'automatisation du côté serveur généralement sans assisté" au lieu de "jamais, en aucune circonstance". (Il suffit de regarder les services HPC pour Excel sur R2 - c'est 100% d'Excel sans surveillance sur le serveur). Ne pas essayer d'être un cul ici, ajoutez simplement une clarté de la situation.


@Otaku: Quoi? Les services HPC sont écrits par Microsoft. S'ils utilisent l'Excel.exe réelle par l'automatisation (que je doute), ils savent probablement comment. La question de la licence n'est pas une "peur". C'est un résumé et j'ai dit que "peut enfreindre".


@John Saunders: Nevermind. Vous voulez juste être juste sur tout, alors allez-y - maintenant vous avez raison. (-1 pour une mauvaise réponse qui n'est pas correcte à la fois techniquement et légalement)


-1 pour ne pas fournir la bonne solution et dévier le sujet à une direction différente, gaspillant ainsi le temps ..


@Xtreme: il y a est aucune solution droite pour utiliser Office Interop sur un serveur. La bonne solution est: "Ne fais pas ça".


@RJ: Il est important de noter que l'automatisation des offices sur le serveur n'est pas recommandée et même découragée, mais certainement pas "hors limites" de quelque manière que ce soit ou une sorte de violation des licences de logiciels. Veuillez vous assurer de voir et d'implémenter, le cas échéant, les recommandations sur support.microsoft.com/kb/257757<< a>.


@Taku: Notez les éléments suivants de l'article que vous avez référencé: «Outre les problèmes techniques, vous devez également envisager des problèmes de licence. Les directives de licence actuelles empêchent d'être utilisées sur un serveur pour servir des demandes client, à moins que ces clients eux-mêmes disposent d'une copie agréée de Bureau. Utilisation de l'automatisation côté serveur pour fournir des fonctionnalités de bureau à des postes de travail sans licence n'est pas couvert par le contrat de licence utilisateur final (CLUF). " C'est ce que je voulais dire par "peut enfreindre votre permis".


@John Saunders: Il n'y avait aucune indication dans la question de l'OP que la page .aspx est utilisée en réponse aux demandes de clients. C'est peut-être, mais nous ne savons pas. D'après ce que je peux lire, il fusionne des données et crée un modèle (que peut-être que les gens téléchargeront ensuite). Le point est que nous ne savons pas. L'article est extrêmement clair sur les considérations techniques et juridiques, comme cela a toujours été. Outre le fait qu'ils violent une licence est également le fait qu'ils ne soient pas du tout violation. Référencement que KB devrait suffire à l'OP de l'opposer.



0
votes

Après avoir installé Office sur la machine cible, assurez-vous d'ouvrir directement l'une des applications comme Word, car il peut y avoir plus d'invites pour activer la licence. L'API ne fonctionnera pas avant de passer à travers ce processus et les erreurs générées ne seront pas claires quant à ce que le problème est vraiment.

La nullreferenceException peut donc être causée par mot incapable d'ouvrir le document, ainsi que des mots.documents.Open () retournerait null. Pour être honnête, je ne suis pas sûr que c'est sûr que c'est ce qui cause votre problème - comme je l'ai dit, les erreurs ne vous diront pas clairement quel est le problème. (J'ai rencontré ce scénario moi-même il y a un moment et même si je sais que l'API jetait une exception, je ne me souviens pas si c'est la même chose que ce que vous voyez.)


2 commentaires

Word ne serait pas impossible d'ouvrir le document et donc de mot.documents.open () retournerait NULL. (Je l'ai rencontré moi-même, même si je ne suis pas sûr de 100% s'il s'agissait d'une exception nullReferenceException que j'ai rencontrée. Quoi qu'il en soit, la source du problème n'était pas évidente.)


Si vous mettrez à jour votre réponse pour inclure ces informations, je serai en mesure de supprimer le bowvote.