为BizTalk中的独立适配器启用默认应用程序域有什么含义?

为BizTalk中的独立适配器启用默认应用程序域有什么含义?,biztalk,biztalk-2013r2,Biztalk,Biztalk 2013r2,我们最近在BizTalk中遇到以下错误 执行接收管道时失败:“Microsoft.BizTalk.DefaultPipelines.PassThruReceive,Microsoft.BizTalk.DefaultPipelines,版本=3.0.1.0,区域性=中性,PublicKeyToken=31bf3856ad364e35”源:“未知”接收端口:“CustomerAPI”URI:“/Service.svc”原因:试图访问卸载的AppDomain 通过研究这个错误,我们得出了上述结论 承载

我们最近在BizTalk中遇到以下错误

执行接收管道时失败:“Microsoft.BizTalk.DefaultPipelines.PassThruReceive,Microsoft.BizTalk.DefaultPipelines,版本=3.0.1.0,区域性=中性,PublicKeyToken=31bf3856ad364e35”源:“未知”接收端口:“CustomerAPI”URI:“/Service.svc”原因:试图访问卸载的AppDomain

通过研究这个错误,我们得出了上述结论

承载SOAP适配器的默认AppDomain被卸载,导致主机进程挂起

问题

承载SOAP适配器的进程挂起,导致进程中的所有其他Web服务挂起。这可能导致以下错误: 执行响应(发送)管道时失败:“未知”源:“未知”接收端口:TwoWayLatencyLopBack_rExport”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消息传递引擎对象将在默认AppDomain中创建,而不是在它们自己的AppDomain中创建。由于默认AppDomain从未卸载,因此问题不再发生

    下面是该设置的屏幕截图

    我们在测试环境中启用了此设置,并注意到内存使用和内存泄漏都有所减少,有关更多详细信息,请参阅Mark Brimble的博客

    为独立适配器设置启用默认应用程序域是否有任何缺点,或者启用此设置会在BizTalk中造成哪些其他影响


    如果没有缺点,为什么默认情况下不为所有隔离主机启用此选项?

    在单独的AppDomain中执行会使它们之间设置的边界更加安全。它还使IIS在不重新启动整个过程的情况下更容易释放/释放资源-如果某个特定的服务/站点未被使用,则其AppDomain可以比重新启动w3wp.exe更便宜地拆除


    但是,在本例中,BizTalk似乎尝试了两种方式—允许IIS通过使用多个AppDomain更好地管理安全性/内存/程序集加载,但无论消息请求何时传入,也只需继续使用默认的AppDomain。这似乎是一个设计缺陷,这使得很难看到您何时希望不检查该设置

    “为什么所有孤立的主机都默认不打开此选项?”生活中有一些这样的问题没有人能回答,请阅读@mahieddine,我已经在我的问题中链接到了该博客:-)我与他一起工作是的,这也是我们的想法。我们关心的是什么东西应该彼此隔离,而不再是。当然,如果我们想再次隔离它们,我们可以将它们放在单独的应用程序池中。