Web服务MS Word比较自动化导致冻结

问题描述:

我的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://*.com/questions/7382704/asp-net-web使用-service-办公室-2010-COM) –

办公自动化是为了自动化桌面程序(Word,Excel等)而开发的。它做了很多假设,它在桌面环境中运行。例如,它可能会在运行多线程的过程中遇到问题。

如果有的话,它不能很好地工作。如果你很幸运,那么它会立即失败,你会发现另一个解决方案。如果你不幸运,你会得到一些东西投入生产,将取决于它,并然后你会开始得到的关键问题,这是很难排除故障,也许不可能解决。

不这样做

asp.net web service using office 2010 COM