我的 WebService 使用 ms word COM 来比较 2 个 .doc 文件。当结果文件将超过 1 Mb 时 - 它会挂起。(对于较小的文件 - 一切正常)。当我在 IIS 上发布和运行 WebService 时会发生这种情况。(主机在 win serv 2008 x64,IIS - 7 下)因此,Word COM 作为 COM 引用添加到 Service。我必须在那里安装 ms word 2010 x64,否则服务会抛出 null ref 异常。
在我的本地计算机上(在 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());
}
有人可以帮忙吗?