【发布时间】:2010-09-02 18:57:24
【问题描述】:
最近在 Windows Server2008、IIS7(安装了 Office)上部署了我的 Web 应用。
在追逐(和捕捉)各种其他错误之后,我面临着一个我什至不知道从哪里开始的错误。
在 Cassini(Visual Studio 开发服务器)上一切正常(通过 excel 互操作读取 excel)。
在 w2008 IIS 上它会抛出模糊的错误:
值不能为空。 参数名称:o
[ArgumentNullException:值不能为空。 参数名称:o] System.Runtime.InteropServices.Marshal.FinalReleaseComObject(Object o) +9430474 c:\longpath\ExcelReader.cs:23 中的 longnamespace.ExcelReader.Dispose() c:\longpath\ApplicationFormReader.cs:32 中的 longnamespace.ApplicationFormReader.Read(String path)
目前,我将添加 null 检查并查看情况是否会好转,但我确实怀疑它只是在开始读取任何内容之前就爆炸并丢弃在 finally 块上。
尝试将应用程序池设置为在本地系统下运行,但这并没有改变任何东西。
有什么想法吗?
这就是 dispose 方法的样子
//http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects-in-c/159419#159419
public void Dispose(){
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.FinalReleaseComObject(_ws); //Worksheet, line 23
_wb.Close();
Marshal.FinalReleaseComObject(_wb); //Workbook
_ap.Quit();
Marshal.FinalReleaseComObject(_ap); //Application
}
我相信这个事件是相关的
机器默认权限设置不授予具有 CLSID 的 COM 服务器应用程序的本地激活权限 {00024500-0000-0000-C000-000000000046} 从地址 LocalHost(使用 LRPC)到用户 NT AUTHORITY\NETWORK SERVICE SID (S-1-5-20)。可以使用组件服务管理工具修改此安全权限。
如果是这样 - 任何人都可以翻译吗?
在组件服务中为Microsoft Excel Application 添加权限到Network service 不知何故不起作用。一种。
删除身份验证级别也没有帮助。
改为
if (_ws != null)
Marshal.FinalReleaseComObject(_ws);
if (_wb != null)
{
_wb.Close();
Marshal.FinalReleaseComObject(_wb);
}
if (_ap != null)
{
_ap.Quit();
Marshal.FinalReleaseComObject(_ap);
}
让我们看看结果如何......
【问题讨论】:
标签: asp.net excel iis-7 interop windows-server-2008