Azure事件网格到Azure中继,混合连接

时间:2018-06-17 10:07:03

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

我正在使用Azure Relay,混合连接处理程序测试Azure Event Grid。它不适合我。

我可以看到发布到Azure Event Grid的消息。到现在为止还挺好。

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

使用Hybrid Connection处理程序查看订阅的指标,我看到以下telemetri:

  • 匹配事件
  • 交付失败
  • 过期活动

...但是我看不到Delivery Succeeded事件???

此外,连接到Azure Relay的混合连接侦听器(只是一个简单的控制台应用程序)不会收到任何内容。我已经通过直接向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 Logic App生成,并使用Event Grid连接器发送到Event Grid。 Azure Logic Apps中的事件网格连接器处于预览状态,因此可以解释我所看到的挑战。

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以使用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;