我在使用ASP.NET MVC中的Microsoft Word打开文档时遇到问题。
这在我的开发人员计算机上完美运行,但在部署到IIS时则无效。
Dim word = New Microsoft.Office.Interop.Word.Application
'This line is failing to return a document object
Dim letter = word.Documents.Add(letter_doc_path)
'This line then fails due to [letter] being null
letter.MailMerge.OpenDataSource(csvPath)
我已将“组件服务”(dcomcnfg)中的权限添加到NETWORK SERVICE用户,该用户首先允许创建Word对象,但我完全不知道如何处理此对象。
我还尝试使用以下行来抑制Word对话框以防万一
word.DisplayAlerts = Microsoft.Office.Interop.Word.WdAlertLevel.wdAlertsNone
没有错误没有帮助这个问题(显然除了空对象引用) - 也许有一种方法可以查询Word以获取特定的错误消息?
答案 0 :(得分:4)
Word在打开任何文档时需要 normal.dot 模板文件,问题出现了,因为IIS用户没有任何地方可以创建normal.dot,因此它在后台失败。
通过为新创建的单词实例(创建它后立即)设置 UserTemplate路径来解决此问题。
路径必须是IIS用户可写的(在我的情况下是NETWORK SERVICE)。
word.Options.DefaultFilePath(Microsoft.Office.Interop.Word.WdDefaultFilePath.wdUserTemplatesPath) = working_folder
所以为了完整性,这里是包含获胜线的原始示例:
Dim word = New Microsoft.Office.Interop.Word.Application
'this line fixed it
word.Options.DefaultFilePath(Microsoft.Office.Interop.Word.WdDefaultFilePath.wdUserTemplatesPath) = working_folder
Dim letter = word.Documents.Add(letter_doc_path)
答案 1 :(得分:0)
我不确定你是如何发现错误的。
如果您从中找到一些线索,请查看以下页面。
答案 2 :(得分:0)
我遇到了同样的问题,Wheelibin建议的设置不足以使用NETWORK SERVICE帐户创建文档。
我最终做的是:
为此创建一个用户帐户 在...下运行的过程。
以用户身份登录并运行Word(此 在Word中执行各种设置任务 该应用程序不会尝试推杆 运行时的模态对话框 服务)。
创建新的应用程序池并进行设置 要以用户帐户身份运行的池。
如果您使用的是Windows 身份验证,您的服务器是 Windows 2003(或2000,大概), 然后this issue适用,而你 需要改变SPN的 服务器,这将打破Windows 任何应用的身份验证 在不同的用户下运行 帐户,或者你必须切换 身份验证提供程序到NTLM 而不是Kerberos。
IIS 7可以使用内核模式身份验证来避免此问题。