2013-01-10 32 views
0

我的WebService使用ms字COM來比較2個.doc文件。當結果文件將超過1 Mb時 - 它會掛起。 (對於較小的文件 - 一切正常)。 當我在IIS上發佈&運行WebService時發生這種情況。 (Host win 2008 x64,IIS - 7) 因此,Word COM作爲COM參考添加到Service中。我不得不在那裏安裝ms word 2010 x64,否則服務會拋出null ref異常。Web服務MS Word比較自動化導致凍結

在我的本地comp(在VS調試模式下),在win 7和office 2010 32位下,一切正常。

詳細信息:我使用JS調用Web服務:

function post_to_url() { 
    var path = "http://localhost:32496/Service1.asmx/runCompareService"; 
    var params = {'mAuthToken':'xU/fnlKCe85R25I8IIRHIQCmPc7rcajYVHLQ3JChv8w=','documentId':'1441378','origVerNum':'1','revisedVerNum':'2'}; 
    var method = "post"; 
    var form = document.createElement("form"); 
    form.setAttribute("method", method); 
    form.setAttribute("action", path); 

     for(var key in params) { 
      if(params.hasOwnProperty(key)) { 
      var hiddenField = document.createElement("input"); 
      hiddenField.setAttribute("type", "hidden"); 
      hiddenField.setAttribute("name", key); 
      hiddenField.setAttribute("value", params[key]); 
      form.appendChild(hiddenField); 
      } 
     } 

     document.body.appendChild(form); 
     form.submit(); 
    } 

C#比較方法:

public void doCompare(String file1path, String file2path, String file3path) 
    { 
     Microsoft.Office.Interop.Word.Application wordApp = null; 
     Microsoft.Office.Interop.Word.Document doc1 = null; 
     Microsoft.Office.Interop.Word.Document doc2 = null; 
     Microsoft.Office.Interop.Word.Document doc = null; 

     object wordTrue = (object)true; 
     object wordFalse = (object)false; 
     object missing = Type.Missing; 

     object fileToOpen = @file1path; 
     object fileToOpen1 = @file2path; 
     object fileToSave = @file3path; 

     try 
     { 
      wordApp = new Microsoft.Office.Interop.Word.Application(); 
      wordApp.Visible = false; 
      wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone; 
      try 
      { 
       doc1 = wordApp.Documents.Open(ref fileToOpen, ref missing, ref wordFalse, ref wordFalse, ref missing, 
       ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref wordTrue, ref missing, 
       ref missing, ref missing, ref missing); 
      } 
      catch (Exception e) 
      { 
       throw new Exception("Failed to open approved file" + e.ToString()); 
      } 
      try 
      { 
       doc2 = wordApp.Documents.Open(ref fileToOpen1, ref missing, ref wordFalse, ref wordFalse, ref missing, 
       ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, 
       ref missing, ref missing, ref missing); 
      } 
      catch (Exception e) 
      { 
       throw new Exception("Failed to open revised file" + e.ToString()); 
      } 
      if ((doc1 != null) && (doc2 != null)) 
      { 
       try 
       { 
        doc = wordApp.CompareDocuments(doc1, doc2, WdCompareDestination.wdCompareDestinationOriginal, WdGranularity.wdGranularityWordLevel, 
        true, true, true, true, true, true, true, true, true, true, "", false); 
        doc.SaveAs2(fileToSave); 
        ((_Document)doc).Close(); 
       } 
       catch (Exception e) 
       { 
        throw new Exception("Failed to save compare result file" + e.ToString()); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      throw new Exception("Failed to open MS Word Application" + e.ToString()); 
     } 
     finally 
     { 
      ((_Application)wordApp).Quit(); 
     } 
    } 

響應更改爲:

private void DownloadToBrowser(String filePath) 
    { 
     FileInfo file = new FileInfo(filePath); 
     byte[] fileBytes = ReadFile(filePath); 

     Context.Response.Clear(); 
     Context.Response.ClearHeaders(); 
     Context.Response.ClearContent(); 
     Context.Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name); 
     Context.Response.AddHeader("Content-Length", file.Length.ToString()); 
     Context.Response.AddHeader("Connection", "close"); 
     Context.Response.ContentType = "application/msword"; 
     Context.Response.ContentEncoding = Encoding.UTF8; 
     Context.Response.OutputStream.Write(fileBytes, 0, fileBytes.Length); 
     Context.Response.Flush(); 
     Context.ApplicationInstance.CompleteRequest(); 
    } 

它看起來像服務掛起COM比較操作

try 
{ 
    doc = wordApp.CompareDocuments(doc1, doc2, WdCompareDestination.wdCompareDestinationOriginal, WdGranularity.wdGranularityWordLevel, 
        true, true, true, true, true, true, true, true, true, true, "", false); 
     doc.SaveAs2(fileToSave); 
     ((_Document)doc).Close(); 
} 
catch (Exception e) 
{ 
     throw new Exception("Failed to save compare result file" + e.ToString()); 
} 

有人可以幫忙嗎?

+0

的可能重複[使用辦公asp.net web服務2010 COM(http://stackoverflow.com/questions/7382704/asp-net-web使用-service-辦公室-2010-COM) –

回答

1

辦公自動化是爲了自動化桌面程序(Word,Excel等)而開發的。它做了很多假設,它在桌面環境中運行。例如,它可能會在運行多線程的過程中遇到問題。

如果有的話,它不能很好地工作。如果你很幸運,那麼它會立即失敗,你會發現另一個解決方案。如果你不幸運,你會得到一些東西投入生產,將取決於它,並然後你會開始得到的關鍵問題,這是很難排除故障,也許不可能解決。

不這樣做

asp.net web service using office 2010 COM