【问题标题】:Azure Event Grid to Azure Relay, Hybrid ConnectionAzure 事件网格到 Azure 中继,混合连接
【发布时间】:2018-11-26 11:33:34
【问题描述】:

我正在使用 Azure 中继混合连接处理程序测试 Azure 事件网格。它不适合我。

我可以看到正在发布到 Azure 事件网格的消息。到目前为止,一切都很好。

我已设置对事件网格主题的订阅,并将其配置为将事件发送到指定为具有混合连接终结点的 Azure 中继的处理程序。

使用混合连接处理程序查看订阅的指标,我看到以下遥测:

  • 匹配事件
  • 投递失败
  • 过期事件

…但我没有看到 Delivery Succeeded 事件???

此外,连接到 Azure 中继的混合连接侦听器(只是一个简单的控制台应用程序)不会收到任何信息。我已经通过将一些测试消息直接发送到 Relay 来测试侦听器,并且效果很好。

合乎逻辑的结论是,发布到事件网格的事件可能没有传递到中继混合连接处理程序。但为什么?没有那么多参数,所以我不确定我做错了什么。配置它似乎相当简单。

我开始相信事件网格/混合连接方案目前不起作用。毕竟是在preview,所以这可以解释它。

我知道这里没什么可做的,但我希望其他人可能对此有一些经验?

问题仍然存在。这些问题似乎与从事件网格订阅传递到混合连接的 json 格式有关。

更新

我终于有时间更仔细地研究一下了。

我设置了Event Grid Tester,每次事件网格收到一条消息时,我都会在日志中看到这个错误:

HybridConnection: Message processing failed - Unable to cast object of type 'Newtonsoft.Json.Linq.JValue' to type 'Newtonsoft.Json.Linq.JObject'.

我仍然无法解决此问题,因为我无法控制消息。消息由 Azure 逻辑应用生成并使用事件网格连接器发送到事件网格。 Azure 逻辑应用程序中的事件网格连接器处于预览状态,这可能解释了我所看到的挑战。

【问题讨论】:

  • 使用混合连接端点的订阅运行良好。我确实建议出于测试目的查看这个简单的 http 服务器/客户端实现,github.com/Azure/azure-relay/tree/master/samples/…
  • 我认为问题可能是由 Logic App 引入的,产生了一些 json,从而在链条的下游造成了挑战。查看更新。
  • 查看我的答案,其中使用 http POST 到混合连接 url 可以帮助您与混合连接订阅者。

标签: azure azure-eventgrid azure-hybrid-connections


【解决方案1】:

我已经使用 Azure Relay 在本地成功测试了事件网格订阅者,并将其记录在案 here。它基于 Microsoft 使用客户端的 WCF 变体提供和实现的示例,而不是 .NET Standard version

【讨论】:

  • 谢谢。很高兴知道。 Azure Portal GUI 不支持 WCF(我在上面的问题中添加了屏幕截图),只能选择混合连接。我想可以使用 Azure CLI 配置 WCF。我正在使用 .NET Standard 变体 - 这似乎是未来的发展方向。
【解决方案2】:

您可以使用 http POST 请求向 HybridConnection url 模拟事件网格消息:

POST https://{myNamespace}.servicebus.windows.net/{myHybridConnectionName}

headers:
    content-type: application/json
    x-ms-version: 2015-07-08
    Aeg-Event-Type: Notification
    Authorization: SharedAccessSignature sr=xxx&sig=xxxx&se=11111111&skn=xxxxx

body:
    {
       "id": "123456",
       "eventTime": "2018-07-22T13:09:07.5164877Z",
       "eventType": "recordInserted",
       "dataVersion": "1.0",
       "metadataVersion": "1",
       "subject": "/myapp/vehicles/motorcycles",
       "data": {
          "make": "Ducati",
          "model": "Monster"
       }
   }

请注意,当 HybridConnection 已打开时,可以从 Azure 事件网格测试器 日志面板复制授权标头的 sasToken。

另一种选择是通过以下代码生成它:

using Microsoft.Azure.Relay;
// ... 
var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("hybridconnectionPolicyName", "hybridconnectionPrimaryKey");
var token = tokenProvider.GetTokenAsync("https://{myNamespace}.servicebus.windows.net/{myHybridConnectionName}", TimeSpan.FromDays(10)).Result.TokenString;

【讨论】:

  • 我创建了一个 Azure 函数。因此,我没有在事件网格主题和混合连接之间进行订阅,而是订阅了一个 Azure 函数,然后将事件发送到混合连接。本质上是在序列中创建一个中间步骤。这行得通。但是,这是一种解决方法,我仍然认为将事件网格主题连接到混合连接的订阅的初始方法将是一个更简单和更清洁的解决方案。
  • 您可以使用 EventGridTester 进行来自 FireTopic 的完整端到端事件测试场景,并在测试人员打开的 HybridConnection 上接收事件。转到自定义主题资源,然后使用 HybridConnection 端点(由测试人员打开)创建一个新订阅。 FireTopic 节点允许将事件发布到事件网格。您应该在“事件”节点中看到此订阅的所有事件消息。
  • 谢谢。您对我在使用 EventGridTester: ''Newtonsoft.Json.Linq.JValue' to type 'Newtonsoft.Json.Linq.JObject'' 时看到的错误有任何想法吗?
  • 事件消息的负载必须是 JArray 或 JObject(它依赖于 eventDeliverySchema)。此错误显示 JValue,例如文本、原始类型等。使用我的答案中的 http POST 请求来播放有效负载或附加调试器并在源文件 = Form1.cs
  • 我的挑战是负载来自逻辑应用程序。我只能通过拦截事件来控制格式,这就是我现在使用 Azure 函数所做的事情。我认为插入 Azure 函数是一种解决方法。
猜你喜欢
  • 2019-04-29
  • 2019-12-09
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多