我在从ASP.NET站点打开word文档时遇到问题。该解决方案在Windows 2003 Server上运行良好,但在Windows 2008服务器x64和Windows 7 x64上无效。
为了简化解决方案,我创建了一个ASP.NET MVC 3站点并尝试从那里打开word文档。
我拥有的环境:Windows 7 x64和MS Office 2010 x64
打开文档的代码如下:
public ActionResult WordTest()
{
var fullFileName = @"C:\inetpub\wwwroot\fpub\TestDocument.docx";
var impersonation = new ImpersonationManager();
impersonation.Impersonate();
try
{
var application = new Application();
try
{
Type documentsType = application.Documents.GetType();
var document =(_Document)documentsType.InvokeMember("Open", BindingFlags.InvokeMethod, null, application.Documents,
new object[] {fullFileName});
try
{
return View(new ModelData {Result = document == null ? "Bad" : "OK"});
}
finally
{
if (document != null)
{
document.Close(false);
Marshal.ReleaseComObject(document);
}
}
}
finally
{
application.Quit(false);
Marshal.ReleaseComObject(application);
}
}
finally
{
impersonation.CloseImpersonation();
}
}
首先,我模仿使用受信任的域用户帐户进行单词交互(ImpersonationManager是一个自定义组件)。该用户有权打开\ save \ close Word Application。在我的测试中,这是我自己的帐户:)
然后我创建Word应用程序实例。 WINWORD进程在模拟帐户下启动。
但是在调用“Open”方法之后,它总是返回null。没有例外,事件查看器中没有信息。
此外,Word进程在此之后将CPU加载100%(1核CPU)。
如果我运行相同的代码(没有模拟)作为控制台应用程序,它可以正常工作。
我想知道这里可能出现什么问题?
更新如果Visual Studio开发服务器用作网站的主机,则可以正常工作
答案 0 :(得分:3)
MS不支持在服务器场景中使用Office互操作(如ASP.NET,Windows服务等) - 请参阅http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2
此外,自Windows Vista以来已经发生了一些与安全相关的更改,基本上很难在Windows服务中执行任何“类似桌面”的操作(IIS / ASP.NET只是Windows服务在这方面的特例) )。
有几个库(免费和商业)来处理Office文件(没有Office Interop)...以帮助您进一步描述您的目标。
答案 1 :(得分:1)
无论接受的答案是否有人需要支持遗留代码。可以在此处找到问题的解决方案:http://social.msdn.microsoft.com/Forums/en-US/0f5448a7-72ed-4f16-8b87-922b71892e07/word-2007-documentsopen-returns-null-in-aspnet