2010-10-05 4 views
3

J'ai une application web qui prend quelques informations sur le client et produit une lettre pour chaque client. Tout fonctionne bien dans mon environnement de test, mais sur le serveur de production, j'obtiens une erreur qui indique que le fichier est corrompu. Je peux ouvrir le fichier .dotx en mot très bien sur le serveur, mais pas via le code. S'il vous plaît aider. Voici mon code:Com Exception: Word n'a pas pu lire ce document. Il peut être corrompu

Object oMissing = System.Reflection.Missing.Value; 

      Object oTrue = true; 
      Object oFalse = false; 

      Word.Application oWord = new Word.Application(); 
      Word.Document oWordDoc = new Word.Document(); 


      oWord.Visible = false; 

      Object oTemplatePath = Request.PhysicalApplicationPath + "letters\\" + letter.letter_data; //samplehollisletter.dotx"; 

      oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing); 

      foreach (Word.Field myMergeField in oWordDoc.Fields) 
      { 

       iTotalFields++; 
       Word.Range rngFieldCode = myMergeField.Code; 
       String fieldText = rngFieldCode.Text; 

       if (fieldText.StartsWith(" MERGEFIELD")) 
       { 

        Int32 endMerge = fieldText.IndexOf("\\"); 
        Int32 fieldNameLength = fieldText.Length - endMerge; 
        String fieldName = fieldText.Substring(11, endMerge - 11); 

        fieldName = fieldName.Trim(); 

        if (fieldName == "letter_title") 
        { 
         myMergeField.Select(); 
         oWord.Selection.TypeText(acct.letter_title); 
        } 
        if (fieldName == "account_id") 
        { 
         myMergeField.Select(); 
         oWord.Selection.TypeText(acct.account_id); 
        } 

        if (fieldName == "address") 
        { 
         myMergeField.Select(); 
         oWord.Selection.TypeText(acct.PEOPLE.home_address + "\r\n" + acct.PEOPLE.home_city + ", " + acct.PEOPLE.home_state + " " + acct.PEOPLE.home_zip); 
        } 

        if (fieldName == "greeting_title") 
        { 
         myMergeField.Select(); 
         oWord.Selection.TypeText(acct.greeting_title); 
        } 

        if (fieldName == "service_name") 
        { 
         myMergeField.Select(); 
         oWord.Selection.TypeText((acct.SERVICEs.FirstOrDefault()).service_name); 
        } 

        if (fieldName == "service_date") 
        { 
         myMergeField.Select(); 
         oWord.Selection.TypeText((acct.SERVICEs.FirstOrDefault()).service_date.ToString()); 
        } 


       } 
      } 
      oWordDoc.PrintOut(); 
      oWordDoc.Close(Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges); 
      Thread.Sleep(2000); 
      oWord.Quit(); 

L'erreur est:

Server Error in '/Tracker2' Application. 

Word n'a pas pu lire ce document. Cela peut être corrompu. Essayez une ou plusieurs des solutions suivantes: * Ouvrez et réparez le fichier. * Ouvrez le fichier avec le convertisseur de récupération de texte. Description: Une exception non gérée s'est produite lors de l'exécution de la requête Web en cours. Veuillez consulter la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.

Détails de l'exception: System.Runtime.InteropServices.COMException: Word n'a pas pu lire ce document. Cela peut être corrompu. Essayez une ou plusieurs des solutions suivantes: * Ouvrez et réparez le fichier. * Ouvrez le fichier avec le convertisseur de récupération de texte.

Erreur Source:

Une exception non gérée a été générée pendant l'exécution de la demande Web actuelle. Les informations concernant l'origine et l'emplacement de l'exception peuvent être identifiées à l'aide de la trace de la pile d'exceptions ci-dessous.

Stack Trace:

[COMException (0x800a141f): Word n'a pas pu lire ce document. Cela peut être corrompu. Essayez une ou plusieurs des solutions suivantes: * Ouvrez et réparez le fichier. * Ouvrez le fichier avec le convertisseur de récupération de texte.] Microsoft.Office.Interop.Word.Documents.Add (objet & modèle, objet & NewTemplate, objet & DocumentType, objet & visible) +0 Tracker.RunLetter2.Button1_Click (Expéditeur d'objet, EventArgs e) dans C: \ Users \ Ethan \ Documents \ Visual Studio 2010 \ Projects \ EstateTracker \ Tracker \ RunLetter2.aspx.cs: 52 System.Web.UI.WebControls.Button.RaisePostBackEvent (String eventArgument) + 154 System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3691

+0

N'automatisez pas Word dans un service. – SLaks

+0

n'est pas dans un service. – ecspot

Répondre

2

J'ai découvert que le problème provient de permissio ns d'un appel WCF utilisant les points de terminaison BasicHTTPBinding. Lorsqu'un appel est effectué en utilisant ce type de point de terminaison, le service suppose l'utilisation d'un compte IIS qui n'a pas de bureau pour ouvrir le mot. C'est une exigence du compte pour automatiser le mot. Même lorsque vous avez un service, qui lance une application Windows, qui lance un mot, l'ensemble des événements aura le privilège de l'appel WCF d'origine et entraînera cette erreur.

Ma solution, bien que pas géniale, ni ce que je veux vraiment, fonctionne pour le moment. J'ai créé une table de file d'attente dans la base de données. J'ai ensuite l'application web insérer une demande pour une tâche à accomplir. Ensuite, sur le serveur, j'ai une application autonome qui vérifie la file d'attente toutes les 60 secondes et traite la requête. Ce n'est pas la meilleure méthode comme je l'ai dit, ça marche.

7

Je sais qu'il est temps que cet article a été ouvert, mais comme je n'avais pas trouvé la réponse n'importe où, suivre la solution pour ceux qui en ont besoin.

1 - Dans IIS, le pool d'applications utilisé par l'application, modifiez l'attribut d'identité à LocalSystem

2 - Créez un dossier appelé Bureau dans les répertoires suivants sur le serveur: C: \ Windows \ System32 \ config \ systemprofile et C: \ Windows \ SysWOW64 \ config \ systemprofile

Après cela, donner l'autorisation complète pour ces deux dossiers au groupe d'utilisateurs IIS: IIS_IUSRS

cela entraînera cet utilisateur d'avoir un " bureau "pour travailler, t En obtenant le mot IIS, utilisez la bibliothèque.

Je l'aide brutalement aide quelqu'un.

+0

Merci, il a résolu mon problème, mais quand j'ai donné la permission complète pour les deux dossiers de bureau, il y a un avertissement sur la sécurité. Cela pose-t-il un problème plus tard? – Willy

Questions connexes