我正在尝试将Brother b-Pac printing library的标签打印设备实现到我的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
我还对转储文件和here's the report使用了 DebugDiag 。尽管在这里它说调试器无法找到bpac.dll
的调试符号,所以它可能是不完整的(如果有帮助,我想知道在哪里以及如何获得第三方DLL的符号)
应用程序是针对 .NET Framework 4.6.1 的多层 ASP.NET MVC 应用程序,它在具有 Windows Server 2012 R2(x64)的虚拟机上运行)和 IIS 8 。 (如果重要,则该项目源自this template)
我搜索了此问题,并尝试了以下解决方案:
wwwroot
和DLL自身文件夹对故障IIS APPPOOL/user
的{{1}}的读/写权限。w3wp.exe
用户相同的权限。IIS_IUSRS, NETWORK, NETWORK SERVICE
用户。我要初始化的COM对象是Administrator
。接口为bpac.Document
,具体类为IDocument
。我以前对这些概念都不熟悉。而且我仍然难以理解,但是我尝试了以下所有行进行初始化:
DocumentClass
此后,我正在使用标签对象打开模板等。但是,一旦应用程序碰到上述任何行,它将使服务器崩溃并重新启动应用程序。
偶然地,在我的WebService(App)项目(而不是Web项目)中,DLL文件被引用为COM库。因此它不会被复制到Document label = new Document();
DocumentClass label = new DocumentClass(); //embed interop types: false
IDocument label = new Document();
文件夹中(我想这是正确的行为吗?)。尝试更改隔离/互操作设置,但不确定这些是否与当前问题有关。
我阅读了有关将COM对象注册到GAC 和为远程访问编组的内容,但是我不知道如何正确地应用这些对象。事实是,官方文档对此没有任何说明。在现代C#ASP.NET设置(only a little on VB〜eww〜)上,没有使用b-Pac库的示例。
我是开发人员,而不是DBA,因此我对调整服务器设置不太自信。但是仅就此问题而言,我修改了太多次。
答案 0 :(得分:0)
因此,问题始终与应用程序ID权限有关。我将应用程序池的标识更改为 LocalSystem ,现在它可以按预期运行。
不过,我不确定这种更改将来会导致什么样的安全漏洞。我将此链接发布给了供应商的技术人员。但是他们还没有给我答案。