如何从沙箱中调用Apache NMS?

如何从沙箱中调用Apache NMS?,apache,dynamics-crm-2011,activemq,sandbox,apache-nms,Apache,Dynamics Crm 2011,Activemq,Sandbox,Apache Nms,我正试图从我的代码('IntPub')调用Apache ActiveMQ NMS版本1.6.0,出于安全原因,该代码必须在.NET 4.0环境中的沙箱中运行。创建沙盒的程序使我的代码“部分受信任”,因此“安全透明”,这似乎意味着它无法创建连接工厂(请参阅下面的错误日志),因为NMS似乎是“安全关键的”。以下是导致此错误的代码: connecturi = new Uri("tcp://my.server.com:61616"); var connectionFactory = new Conne

我正试图从我的代码('IntPub')调用Apache ActiveMQ NMS版本1.6.0,出于安全原因,该代码必须在.NET 4.0环境中的沙箱中运行。创建沙盒的程序使我的代码“部分受信任”,因此“安全透明”,这似乎意味着它无法创建连接工厂(请参阅下面的错误日志),因为NMS似乎是“安全关键的”。以下是导致此错误的代码:

connecturi = new Uri("tcp://my.server.com:61616"); 
var connectionFactory = new ConnectionFactory(connecturi); 
我也尝试了类似的结果:

connecturi = new Uri("activemq:tcp://my.server.com:61616"); 
var connectionFactory = NMSConnectionFactory.CreateConnectionFactory(connecturi); 
既然我不能更改程序集的安全级别(沙箱阻止了它),有没有办法让NMS作为“安全关键”运行,这样就可以被“安全透明”代码调用?我是否必须重新编译它才能这样做,或者NMS是否执行了一些永远不会被视为“安全关键”的操作

我感谢你的帮助和建议


Assembly'IntPub,Version=1.0.0.0,Culture=neutral,PublicKeyToken=6fa620743b8dc60a'是部分受信任的,这会导致CLR使其完全安全透明,而不考虑程序集中的任何透明批注。为了访问安全关键代码,必须完全信任此程序集。详细信息:
-2147220956
插件(执行)出现意外异常:Test.Client:System.MethodAccessException:尝试通过安全透明方法“Test.Client.Execute(System.IServiceProvider)”访问安全关键方法“Apache.NMS.ActiveMQ.ConnectionFactory..ctor(System.Uri)”失败。

从错误消息属性可以看出,您正在沙箱模式下运行Dynamics CRM 2011插件,该插件有一些关于您可以做什么和不能做什么的非常具体的规则。特别是,您只能通过HTTP和HTTPS进行网络连接,因此尝试原始TCP套接字肯定会失败

请查看上的此MSDN页面。似乎有一种方法可以通过修改系统注册表项来放松网络限制,在regex值中包括tcp等。下面是该页的摘录注意:我自己还没有这样做,所以不能肯定它会起作用

沙盒插件和自定义工作流活动可以访问 通过HTTP和HTTPS协议建立网络。这种能力提供 支持访问流行的web资源,如社交网站、新闻 提要、web服务等。以下web访问限制 应用于此沙箱功能

  • 只允许使用HTTP和HTTPS协议
  • 不允许访问本地主机(环回)
  • 无法使用IP地址。您必须使用需要DNS名称解析的命名web地址
  • 支持并推荐匿名身份验证。没有提示登录用户输入凭据或保存这些凭据的规定
这些默认web访问限制在上的注册表项中定义 运行Microsoft.Crm.Sandbox.HostService.exe的服务器 过程系统可以更改注册表项的值 管理员根据业务和安全需要进行管理。登记处 服务器上的密钥路径为:

HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\MSCRM\SandboxWorkerOutboundUriPattern

键值是定义web访问限制的正则表达式字符串。 默认键值为:

“^http[s]?:/(?!((localhost[:/))|([.]))|([0-9]+[:/)|(0x[0-9a-f]+[:/)|(([0-9]+)|(0x[0-9a-f]+){3}([0-9]+)|(0x[0-9a-f]+)[:/)))+”*

通过更改此注册表项值,可以更改沙盒插件的web访问权限


谢谢你,约翰。您对该限制的看法是正确的,但不幸的是,无法为CRM Online更改该限制。因此,它回避了一个问题,“有没有办法让NMS通过http与ActiveMQ通信:?”此外,它还回避了一个问题,“NMS做的其他事情是否会违反安全模型?”如果您的目标是在线CRM,您可能会更幸运地在Azure(或其他地方)中托管Web服务这就完成了您需要的工作,并从您的插件调用了该Web服务。不过,这会带来延迟成本,所以要小心——特别是因为插件在CRM杀死它们之前有最长的运行时间。
Assembly 'IntPub, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fa620743b8dc60a' is partially trusted, which causes the CLR to make it entirely security transparent regardless of any transparency annotations in the assembly itself.  In order to access security critical code, this assembly must be fully trusted.Detail: 
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
  <ErrorCode>-2147220956</ErrorCode>
  <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
  <Message>Unexpected exception from plug-in (Execute): Test.Client: System.MethodAccessException: Attempt by security transparent method 'Test.Client.Execute(System.IServiceProvider)' to access security critical method 'Apache.NMS.ActiveMQ.ConnectionFactory..ctor(System.Uri)' failed.