![](/img/trans.png)
[英]Authenticate from MS Dynamics 365 to Azure Service Bus using Azure AD
[英]Filtering of messages posted from Dynamics 365 to Azure Service Bus
我需要将来自 Dynamics 365 的消息发布到 Azure 服务总线主题,并通过从订阅中读取的 Azure function 处理该主题。 我已经成功地做到了这一点。 从动态发布的消息来自两种类型的操作:创建和更新。
我需要在主题上设置过滤器,以便每个主题(一个用于创建,另一个用于更新)只有满足过滤条件的消息。 来自 Dynamics 的消息负载(通过插件注册工具服务端点注册)具有指示负载是来自创建还是更新操作的属性。 我了解主题的过滤器只能为消息头而不是有效负载设置。 端点注册截图
消息 header 中是否有任何属性表明该消息来自创建请求或更新请求? 或者有没有办法查看从动态到服务总线的消息及其标头?
消息 header 中是否有任何属性表明该消息来自创建请求或更新请求?
问题与 Azure 服务总线有关,我认为没有这种方法(根据我的理解)。
现在满足您的要求,您需要在创建主题(服务总线)上创建从 crm 到 go 的消息,并且与更新消息相同。 这可以实现,您必须在 crm 中为特定实体的创建和更新触发器注册插件。 在此插件中,您必须使用 SASKey 连接您想要的 Azure 服务总线正确主题(有很多示例)并将 crm 消息推送到您的服务总线主题。
下面的伪代码用于理解将 object 发送到服务总线。 请不要按原样接受,只是为了证明这是可以实现的,我们在我们的一个项目中做到了这一点。
public bool SendObjectToBus<TBusObject>(TBusObject serializedObject, HttpMessageHandler messagHandler = null)
where TBusObject: IBusObject
{
if (string.IsNullOrEmpty(_sasToken) || validUntil >= DateTime.UtcNow - new DateTime(1970, 1, 1))
{
_sasToken = GetSasToken(new TimeSpan(0, 0, 90));
}
string json = JsonSerializer.Serialize(serializedObject);
HttpClient client = messagHandler == null ? new HttpClient() : new HttpClient(messagHandler);
client.DefaultRequestHeaders.Add("Authorization", _sasToken);
using (var Content = new StringContent(json, Encoding.UTF8, "application/json"))
{
_headerContext.AddHeaders(Content.Headers, ApiSettings.EnvironmentType);
//this._tracingService.Trace("Sending Message to Servicebus");
var response = client.PostAsync(ApiSettings.GetTopicURL(), Content);
response.Wait();
return response.Result.IsSuccessStatusCode;
}
//this._tracingService.Trace("Message sent");
//this._tracingService.Trace(response.Result.StatusCode.ToString());
}
private string GetSasToken(TimeSpan validRange)
{
TimeSpan sinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1);
validUntil = sinceEpoch + validRange;
string expiry = Convert.ToString(validUntil.TotalSeconds);
string stringToSign = Uri.EscapeDataString(ApiSettings.ServiceBusNamespaceUrl).ToLowerInvariant() + "\n"
+ expiry;
HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(ApiSettings.SASValue));
var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
var sasToken = string.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}",
Uri.EscapeDataString(ApiSettings.ServiceBusNamespaceUrl).ToLowerInvariant(),
Uri.EscapeDataString(signature),
expiry,
ApiSettings.SASKey);
return sasToken;
}
在消息到达 Azure 服务总线后(配置在问题帖子中共享),预览功能允许我们查看已到达的消息。 我们还可以选择查看消息属性,请参阅屏幕截图Message Propereties 。 从那里,我可以发现有一个自定义属性指示消息是创建还是更新,并使用它设置了 SQL 过滤器,并且消息被成功过滤。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.