从 CRM 插件订阅 Azure 服务总线主题
Azure Service Bus Topic subscribe from CRM plugin
我成功地将消息从 CRM 插件发布到 Azure 服务总线队列。理想情况下,我需要 CRM 来收听主题(订阅)并在接收时执行操作。我不知道这是否适用于 CRM,也找不到实施它的方法。我可以使用以下内容从队列中读取;
MessagingFactory factory = MessagingFactory.CreateFromConnectionString(QueueConnectionString);
//Receiving a message
MessageReceiver testQueueReceiver = factory.CreateMessageReceiver(QueueName);
while (true)
{
using (BrokeredMessage retrievedMessage = testQueueReceiver.Receive())
{
try
{
var message = new StreamReader(retrievedMessage.GetBody<Stream>(), Encoding.UTF8).ReadToEnd();
retrievedMessage.Complete();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
retrievedMessage.Abandon();
}
}
}
但是,当用户操作执行插件时会调用它。我需要一直倾听。这可以通过 CRM 实现吗?我在本地使用 CRM 2016,消息总线托管在 Azure 中。
感谢您的指点。
CRM 不是一个始终监听的应用程序。它是由 HTTP 请求触发的 Web 应用程序。要弥合这一差距,您可以使用 Azure Functions。由于 Azure Function 可以由服务总线触发 并且 可以调用 Dynamics CRM。
您将需要创建部署由服务总线队列触发的 Azure 函数。这在以下位置有详细记录:https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-service-bus
为您的 Azure 函数创建 package.json
:
{
"bindings": [
{
"queueName": "testqueue",
"connection": "MyServiceBusConnection",
"name": "myQueueItem",
"type": "serviceBusTrigger",
"direction": "in"
}
],
"disabled": false
}
基本功能代码:
public static void Run(string myQueueItem, TraceWriter log)
{
log.Info($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
}
完成此工作后,您可以构建 Azure Functions 代码以连接到 Dynamics CRM - 与任何其他代码一样。
将依赖项添加到 project.json(必须按照此处的讨论完全正确:http://crmtipoftheday.com/2016/12/12/connect-to-dynamics-365-in-azure-functions/):
{
"frameworks": {
"net46":{
"dependencies": {
"Microsoft.CrmSdk.CoreAssemblies": "8.2.0",
"Microsoft.CrmSdk.XrmTooling.CoreAssembly": "8.2.0"
}
}
}
}
尼克的建议很完美。另一种方法是使用逻辑应用程序。 Dynamics 365 有一个可用的连接器,允许您在图形界面中执行 crud 操作。您不能在逻辑应用程序中编写代码,而在 Azure 函数中您可以使用代码实现您的逻辑。 Logic App 类似于 Dynamics 365 中的工作流,并且能够从队列或订阅中读取上下文。
我成功地将消息从 CRM 插件发布到 Azure 服务总线队列。理想情况下,我需要 CRM 来收听主题(订阅)并在接收时执行操作。我不知道这是否适用于 CRM,也找不到实施它的方法。我可以使用以下内容从队列中读取;
MessagingFactory factory = MessagingFactory.CreateFromConnectionString(QueueConnectionString);
//Receiving a message
MessageReceiver testQueueReceiver = factory.CreateMessageReceiver(QueueName);
while (true)
{
using (BrokeredMessage retrievedMessage = testQueueReceiver.Receive())
{
try
{
var message = new StreamReader(retrievedMessage.GetBody<Stream>(), Encoding.UTF8).ReadToEnd();
retrievedMessage.Complete();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
retrievedMessage.Abandon();
}
}
}
但是,当用户操作执行插件时会调用它。我需要一直倾听。这可以通过 CRM 实现吗?我在本地使用 CRM 2016,消息总线托管在 Azure 中。
感谢您的指点。
CRM 不是一个始终监听的应用程序。它是由 HTTP 请求触发的 Web 应用程序。要弥合这一差距,您可以使用 Azure Functions。由于 Azure Function 可以由服务总线触发 并且 可以调用 Dynamics CRM。
您将需要创建部署由服务总线队列触发的 Azure 函数。这在以下位置有详细记录:https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-service-bus
为您的 Azure 函数创建 package.json
:
{
"bindings": [
{
"queueName": "testqueue",
"connection": "MyServiceBusConnection",
"name": "myQueueItem",
"type": "serviceBusTrigger",
"direction": "in"
}
],
"disabled": false
}
基本功能代码:
public static void Run(string myQueueItem, TraceWriter log)
{
log.Info($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
}
完成此工作后,您可以构建 Azure Functions 代码以连接到 Dynamics CRM - 与任何其他代码一样。
将依赖项添加到 project.json(必须按照此处的讨论完全正确:http://crmtipoftheday.com/2016/12/12/connect-to-dynamics-365-in-azure-functions/):
{
"frameworks": {
"net46":{
"dependencies": {
"Microsoft.CrmSdk.CoreAssemblies": "8.2.0",
"Microsoft.CrmSdk.XrmTooling.CoreAssembly": "8.2.0"
}
}
}
}
尼克的建议很完美。另一种方法是使用逻辑应用程序。 Dynamics 365 有一个可用的连接器,允许您在图形界面中执行 crud 操作。您不能在逻辑应用程序中编写代码,而在 Azure 函数中您可以使用代码实现您的逻辑。 Logic App 类似于 Dynamics 365 中的工作流,并且能够从队列或订阅中读取上下文。