我们最近在BizTalk中遇到以下错误
执行接收管道失败:“Microsoft.BizTalk.DefaultPipelines.PassThruReceive,Microsoft.BizTalk.DefaultPipelines,Version = 3.0.1.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”来源:“未知”接收端口:“ CustomerAPI“URI:”/ Service.svc“原因:尝试访问已卸载的AppDomain。
研究此错误导致我们Known Issues with the SOAP Adapter说。
托管SOAP适配器的默认AppDomain会被卸载导致主机进程挂起
问题:
托管SOAP适配器的进程挂起,导致进程中的所有其他Web服务挂起。这可能会导致以下错误: 执行响应(发送)管道失败:“未知”源:“未知”接收端口:TwoWayLatencyLoopBack_RxPort“URI:”/ TwoWayLatencyRxSOAP/TwoWayLatencyWS.asmx“原因:尝试访问已卸载的AppDomain。
原因
SOAP适配器在IIS进程空间中运行。如果IIS AppPool中存在多个Web服务,则每个Web服务最终都拥有自己的AppDomain。
默认情况下,所有消息传递引擎对象都在第一个AppDomain中创建(即,与第一个Web服务对应的AppDomain)。如果第一个Web服务因任何原因长时间处于非活动状态,IIS将卸载第一个AppDomain。发生这种情况时,托管过程中的所有服务都将无法使用。
解决
要防止卸载AppDomain,请按照以下步骤操作:
单击“开始”,指向“所有程序”,指向“Microsoft BizTalk Server”,然后单击“BizTalk Server管理”。
在BizTalk Server管理控制台中,展开“BizTalk Server管理”,展开“BizTalk组”,展开“平台设置”,然后单击“主机”。
- 在“主机”列表中,右键单击所需的主机,然后单击“设置”。
- 在BizTalk设置仪表板中,在“常规”选项卡下选中“隔离适配器的默认应用程序域”。
醇>执行此操作时,BizTalk Messaging Engine对象将在默认AppDomain中创建,而不是在其自己的AppDomain中创建。由于永远不会卸载默认的AppDomain,因此不再出现问题。
以下是该设置的屏幕截图。
我们在测试环境中启用了此设置,并注意到内存使用量和内存泄漏率已降低,请参阅Mark Brimble的博客BizTalk Host Settings – “Default application domain for isolated adapter”以获取更多详细信息。
启用默认应用程序域以进行隔离的适配器设置是否有任何缺点,或者在BizTalk中启用此设置会产生哪些其他影响?
如果没有缺点,为什么默认情况下不对所有隔离主机启用它?
答案 0 :(得分:1)
在单独的AppDomains中执行应该使它们之间建立的边界更安全。它还使IIS更容易释放/释放资源而无需重新启动整个过程 - 如果某个特定服务/站点未被使用,其AppDomain可以比重新启动w3wp.exe更便宜地拆除。
然而,在这种情况下,似乎BizTalk尝试两种方式 - 允许IIS通过使用多个AppDomain更好地管理安全性/内存/程序集加载,但也只是继续使用默认的一个,无论什么时候消息请求这似乎是一个设计缺陷,这使得很难看到你何时想要不加控制地保留这个设置。