c# - 初始化外部 COM 对象会导致 w3wp.exe 因“访问冲突”错误而崩溃
问题描述
我正在尝试将用于标签打印设备的 Brother b-Pac 打印库实现到我的 Web 应用程序中。我需要在服务器上创建/加载标签模板并通过浏览器从客户端机器上打印。
我的代码完全适用于我的开发环境。它只发生在已发布的版本上。这是应用程序调用 COM 对象时引发的访问被拒绝错误。我怀疑有一个我无法触及的内部异常。
事件记录如下:
Faulting application name: w3wp.exe, version: 8.5.9600.16384
Faulting module name: bpac.dll, version: 3.2.0.20
Exception code: 0xc0000005
Fault offset: 0x0010beea
Faulting application path: C:\Windows\SysWOW64\inetsrv\w3wp.exe
Faulting module path: C:\Program Files (x86)\Common Files\Brother\b-PAC\bpac.dll
我还在转储文件上使用了DebugDiag ,这是报告。虽然它说这里调试器无法找到调试符号bpac.dll
,所以它可能不完整(如果它可能有帮助,我想知道在哪里以及如何获取第 3 方 DLL 的符号)
应用程序是面向.NET Framework 4.6.1的多层ASP.NET MVC应用程序,在具有Windows Server 2012 R2 (x64)和IIS 8的虚拟机上运行。(如果重要的话,项目是从这个模板派生的)
我搜索了这个问题并尝试了以下解决方案:
wwwroot
将DLL 自己的文件夹的读/写权限授予IIS APPPOOL/user
故障w3wp.exe
.- 给
IIS_IUSRS, NETWORK, NETWORK SERVICE
用户同样的权限。 - 冒充
Administrator
用户。 - 卸载/安装 32 位/64 位版本的 b-Pac SDK。
- 将我的 ASP 应用程序和所有项目的位数更改为 x86/x64。
- 在应用程序池上启用 32 位。
- 为2018 年 7 月更新问题修补 Windows
- 将匿名身份验证、应用程序池身份等全部设置为默认池用户。
- 动态加载 DLL。(不确定我是否正确地这样做了)
我试图初始化的 COM 对象是bpac.Document
. 接口是IDocument
,具体类是 DocumentClass
。我以前对这些概念都不熟悉。而且我仍在努力理解,但我尝试了以下所有这些行进行初始化:
Document label = new Document();
DocumentClass label = new DocumentClass(); //embed interop types: false
IDocument label = new Document();
之后,我使用标签对象打开模板等。但是一旦应用程序遇到上述任何一行,它就会使服务器崩溃并重新启动应用程序。
顺便说一句,DLL 文件在我的 WebService (App) 项目(不在 Web 项目中)中被引用为 COM 库。所以它不会被复制到bin
文件夹中(我猜这是正确的行为?)。尝试更改隔离/互操作设置,但我不确定这些是否与手头的问题有关。
我阅读了有关将 COM 对象注册到 GAC和编组以进行远程访问的内容,但我无法掌握如何正确应用这些内容。问题是,官方文档对此没有任何说明。并且没有一个在现代 C# ASP.NET 设置中使用 b-Pac 库的示例(在 VB 上只有一点点~eww~)。
我是开发人员,而不是 DBA,所以我对调整服务器的设置不太自信。但是就这个问题,我修改了太多太多的东西太多次了。
解决方案
因此,问题一直与应用程序 ID 权限有关。我将应用程序池的标识更改为LocalSystem,现在它按预期工作。
不过,我不确定这种变化将来会导致什么样的安全漏洞。我将此链接发布给供应商的技术人员。但他们还没有给我答复。
推荐阅读
- react-native - 用户对象在应用程序中是空的,即使它是从后端服务器返回的
- android - Google play 应用内更新 api 可用性和用途
- python - 处理来自模块的异常
- java - Selenium Java -HtmlUnitDriver - 在页面上找不到任何元素?
- python - 如何在 lmplot 的每个轴上绘制注释?
- r - 使用 Magick 包中的 image_read 读取 tif 图像时遇到问题
- graph - 建议在 Angular 6 中使用图表 api
- laravel-5 - 推送到生产服务器时的 Laravel 存储问题
- ios - 使用 Fastlane 扫描 SonarQube iOS 项目中的分支名称
- django - I have a file generated from Django, I need to send that file as response to frontend using drf?