2010-09-02 21 views
0

最近在Windows Server2008 IIS7上安装了我的Web应用程序(安装了Office)。如何在Windows 2008上做excel互操作?

追逐(&捕)其他各种错误后,我面临一个我不知道,甚至从哪里开始。

在卡西尼(视觉工作室开发服务器)上,一切工作完美无缺(通过excel interop阅读excel)。

在w2008 IIS它抛出模糊的错误:

Value cannot be null. Parameter name: o

[ArgumentNullException: Value cannot be null. Parameter name: o] System.Runtime.InteropServices.Marshal.FinalReleaseComObject(Object o) +9430474 longnamespace.ExcelReader.Dispose() in c:\longpath\ExcelReader.cs:23 longnamespace.ApplicationFormReader.Read(String path) in c:\longpath\ApplicationFormReader.cs:32

目前,我要去加空检查,看看如果事情变得更好,但我怀疑这只是打击了之前部署在finally块它甚至开始阅读任何东西。

试图设置应用程序池在localsystem下运行,但没有任何改变。

任何想法?


这方法如何处置看起来像

//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 
    } 

我相信如果是此事件相关

The machine-default permission settings do not grant Local Activation permission for the COM Server application with CLSID {00024500-0000-0000-C000-000000000046} to the user NT AUTHORITY\NETWORK SERVICE SID (S-1-5-20) from address LocalHost (Using LRPC). This security permission can be modified using the Component Services administrative tool.

- 任何人都可以翻译?

在组件服务添加适合Microsoft Excel ApplicationNetwork service不知何故没有工作。善良的。

删除身份验证级别也无济于事。


改为

if (_ws != null) 
    Marshal.FinalReleaseComObject(_ws); 
    if (_wb != null) 
    { 
    _wb.Close(); 
    Marshal.FinalReleaseComObject(_wb); 
    } 
    if (_ap != null) 
    { 
    _ap.Quit(); 
    Marshal.FinalReleaseComObject(_ap); 
    } 

让我们来看看它是如何去...

回答

2

例外看起来相当简单:在你的代码中呼吁Marshal.FinalReleaseComObject线23,传递一个空参考。

所以_ws,_wb或_ap是空引用。如果您寻找第23行,您将能够看到哪一个。

要解决此问题,请在调用FinalReleaseComObject之前测试null。

的GUID {00024500-0000-0000-C000-000000000046}在事件中引用的Excel是 - 你就可以看到注册表编辑器。

所以我怀疑正在发生的事情是你没有张贴代码试图实例Excel应用程序对象(_ap?)抛出一个异常,由于权限不足。然后因为你的Dispose方法没有检查_ap为null,它会再次抛出。

我怀疑你在为网络服务帐户授予本地激活权限时处于正确的轨道。不知道为什么这不起作用,也许你需要重新启动或重新启动IIS?

UPDATE另外Excel Interop不推荐用于服务器应用程序。其他方式操纵Excel文档比较好,例如使用Aspose等第三方组件。

我似乎记得的一件事情是,Excel需要在具有本地配置文件的帐户下运行,而网络服务帐户可能不是这种情况。因此,如果您需要使用Excel Interop,那么在注释中提到的其他帐户下运行它可能是最佳解决方案。

+0

奇怪的是 - 为什么它在IIS上部署之前从未为空? :/ – 2010-09-02 19:42:59

+0

作为dcom设置中的标识切换到特定用户,并最终奏效。上帝,我累了... ...整天斗牛逼像这样的问题。该回家了。并感谢您的时间。 – 2010-09-02 19:49:13

+0

“奇怪的是 - 为什么它在IIS上部署之前从未为空?” - 可能是因为未部署的其他代码在部署到IIS之前成功实例化_ap对象。 – Joe 2010-09-02 19:56:01