发布asp.net应用程序后,其中导入、导出excel报错的解决方案
消息: Sys.WebForms.PageRequestManagerServerErrorException: Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005 拒绝访问。 (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)).
在asp.net程序中用到了导入、导出excel 在调试的时候没有问题,能够正常导入。但在发布到IIS后出现以上错误。折磨的朕好是辛苦,有网友提出了如下解决办法:
第一种:(可以实现)
在服务器上点击开始—运行—输入:Dcomcnfg然后回车,系统将弹出分布式COM配置属性窗体。
在“应用程序”页里面选择“Microsoft Excel 应用程序”。点击“属性”按钮,系统将弹出该应用程序的属性窗体。
在“常规”页中的身份验证级别下拉列表中选择“无”。
在“安全性”页中选中“使用自定义访问权限”和“使用自定义启动权限”,然后分别点击访问用户和启动用户对应的“编辑”按钮,在里面添加用户“everyone”。
最后在“身份标示”页里面选中“交互式用户”。
第二种:(可以实现)
在web.config中<system.web>中加入如下配置
<identity impersonate="true" userName="[计算机登录用户名]" password="[密码]"/>。
这个方法朕不推荐,原因如下:
如果登陆用户的密码改变将会报错,而且将登陆密码写在web.config中也是不安全的。
朕的实现方法:
上面两种皆可实现但我还是要说说我的看法:
首先说说为什么会出现这样的错误?
是因为我们访问站点的时候是属于"NETWORK SERVICE"这个用户组访问的,不信可以到“任务管理器”-“进程”中看(w3wp.exe这个进程的用户名)。
w3wp.exe——是在IIS(因特网信息服务器)与应用程序池相关联的一个进程,如果你有多个应用程序池,就会有对应的多个w3wp.exe的进程实例运行。
这个进程用来分配大量的系统资源。这个进程对于系统的稳定和安全具有重要的意义,不能轻易的结束掉这个进程。
w3wp.exe——的启动用户是系统内置安全帐户network service。
w3wp.exe——的正常路径是%windir%\system32\inetsrv,一般在C:\WINDOWS\system32\inetsrv
废话我就不多说了,由于这个“NETWORK SERVICE”这个用户组没有启动和激活、访问Excel的权限所以出现这个错误。既然知道了原因就好办了。
解决方法如下:
和上面第一种方法差不多,唯独的差别就是加入的不是EVERYONE用户组而是NETWORK SERVICE用户组。
不用修改在“常规”页中的身份验证级别下拉列表中的选择 ,“默认”就可以了。注意:在“身份标示”页里面选中“交互式用户”,否则有可能出现错误。