我的WebService使用ms字COM来比较2个.doc文件。当结果文件将超过1 Mb时 - 它会挂起。 (对于较小的文件 - 一切都很好)。 当我在IIS上发布和运行WebService时会发生这种情况。 (主持人在win serv 2008 x64,IIS - 7) 因此,Word COM添加到服务作为COM参考。我不得不在那里安装ms word 2010 x64,否则服务会抛出null ref异常。
在我的本地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 :(得分:1)
Office Automation是为自动化桌面程序(Word,Excel等)而开发的。它做了许多假设,它在桌面环境中运行。例如,它可能在多线程进程中运行时出现问题。
如果有的话,效果不好。如果你很幸运,它会立即失败,你会找到另一个解决方案。如果你不幸运,你会投入生产,依赖它,然后你将开始遇到难以排除故障并且可能无法修复的关键问题。 / p>