你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure 事件网格和 Azure 中继将事件发送到专用目标中托管的 Webhook

本文介绍如何使用 Azure 中继将事件从 Azure 事件网格接收到专用目标(例如本地服务器或虚拟机)中托管的 Webhook。

Azure 中继是一项服务,允许安全地向公有云公开位于企业网络内的服务,无需打开防火墙连接,也无需对企业网络基础结构进行彻底更改。

Azure 中继支持混合连接,这些连接是在现有 Azure 中继功能的基础上演进的安全开放协议,可在包含基本 WebSocket 功能(包括接受从 Azure 事件网格发起的中继流量的选项)的任何平台和任何语言中实现。 请参阅 Azure 中继混合连接协议指南 - Azure 中继

将事件从事件网格基本资源接收到专用目标中的 Webhook

本部分提供了使用 Azure 中继将事件从事件网格基本资源接收到专用目标中托管的 Webhook 的大致步骤。

  1. 创建 Azure 中继资源。 可以使用 Azure 门户、Azure CLI 或 Azure 资源管理器模板创建中继命名空间和混合连接。 有关详细信息,请参阅使用 Azure 门户创建 Azure 中继命名空间和混合连接

    注意

    确保已启用选项:需要客户端授权。 此选项可确保只有经过授权的客户端才能连接到混合连接终结点。 可以使用 Azure 门户或 Azure CLI 启用客户端授权和管理客户端授权规则。 有关详细信息,请参阅安全 Azure 中继混合连接

  2. 实现 Azure 中继混合连接侦听器。

    • 选项 1:可以使用适用于 .NET 的 Azure 中继 SDK 以编程方式创建混合连接侦听器并处理传入的请求。 有关详细信息,请参阅 Azure 中继混合连接 - HTTP 请求 (.NET)
    • 选项 2:Azure 中继桥。 可以使用 Azure 中继桥,这是一个跨平台命令行工具,可以创建来自或通往任意位置的无 VPN TCP 隧道。 可以将 Azure 中继桥作为 Docker 容器或独立的可执行文件来运行。 有关详细信息,请参阅 Azure 中继桥
  3. 确保混合连接侦听器已连接。 可以使用以下 Azure CLI 命令列出命名空间中的混合连接并检查其状态。

    az relay hyco list --resource-group [resource-group-name] --namespace-name [namespace-name]. You should see a "listenerCount" attribute in the properties of your hybrid connection.
    
  4. 创建 Azure 事件网格系统主题。 可以使用 Azure 门户、Azure CLI 或 Azure 资源管理器模板创建一个系统主题,该主题对应于具有事件(例如存储帐户、事件中心或 Azure 订阅)的 Azure 服务。 有关详细信息,请参阅 Azure 事件网格中的系统主题

  5. 创建系统主题的事件订阅。 可以使用 Azure 门户、Azure CLI 或 Azure 资源管理器模板创建一个事件订阅,该订阅定义事件的筛选器条件和目标终结点。 在这种情况下,请选择“Azure 中继混合连接”作为终结点类型并提供混合连接的连接字符串。 有关详细信息,请参阅 Azure 中继混合连接作为事件处理程序

使用 Webhook 从 Azure 事件网格接收事件时的注意事项

确保已实现云事件验证握手。 下面是以 C# 编写的示例代码,演示如何验证订阅创建期间所需的云事件架构握手。 可以使用此示例代码作为参考,以偏好的语言实现自己的验证握手逻辑。

if (context.Request.HttpMethod == "OPTIONS" && context.Request.Url.PathAndQuery == _settings!.relayWebhookPath)
{
                context.Response.StatusCode = HttpStatusCode.OK;
                context.Response.StatusDescription = "OK";

                var origin = context.Request.Headers["Webhook-Request-Origin"];
                context.Response.Headers.Add("Webhook-Allowed-Origin", origin);
                using (var sw = new StreamWriter(context.Response.OutputStream))
                {
                                sw.WriteLine("OK");
                }

                context.Response.Close();
}

如果要将事件从 Azure 中继桥转发到本地 Webhook,可以使用以下命令:

.\azbridge.exe -x "AzureRelayConnectionString" -H [HybridConnectionName]:[http/https]/localhost:[ApplicationPort] -v