You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何通过SSL将Azure Function App连接至MQ服务器?

从Azure Function App通过SSL连接MQ服务器的可行配置方案

.NET 6 版本配置步骤

1. 安装对应NuGet包

直接安装IBM官方提供的.NET 6兼容包:

Install-Package IBM.XMS.Client.Core
Install-Package IBM.XMS.Client.WMQ

建议使用最新稳定版,避免预览版带来的兼容性问题。

2. 配置MQ连接参数

在Azure Function的应用设置中添加以下参数(避免硬编码):

  • MQ_QUEUE_MANAGER:队列管理器名称
  • MQ_HOST_NAME:MQ服务器主机名/IP
  • MQ_PORT:SSL连接端口(通常为1414,以服务器配置为准)
  • MQ_CHANNEL:SSL通道名称(如SYSTEM.SSL.SVRCONN,需在MQ服务器提前配置)
  • MQ_SSL_CIPHER_SUITE:加密套件(如TLS_RSA_WITH_AES_256_CBC_SHA256,需与服务器配置一致)
  • MQ_SSL_PEER_NAME(可选):验证服务器证书的DN,用于强身份验证

3. 代码实现示例

using IBM.XMS;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

public class MQFunction
{
    private readonly ILogger<MQFunction> _logger;
    private readonly IXMSFactoryFactory _factoryFactory;

    public MQFunction(ILogger<MQFunction> logger)
    {
        _logger = logger;
        _factoryFactory = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);
    }

    [Function("MQSSLConnect")]
    public void Run([TimerTrigger("0 */5 * * * *")] MyInfo myTimer)
    {
        try
        {
            // 从应用设置读取参数
            var queueManager = Environment.GetEnvironmentVariable("MQ_QUEUE_MANAGER");
            var hostName = Environment.GetEnvironmentVariable("MQ_HOST_NAME");
            var port = int.Parse(Environment.GetEnvironmentVariable("MQ_PORT"));
            var channel = Environment.GetEnvironmentVariable("MQ_CHANNEL");
            var cipherSuite = Environment.GetEnvironmentVariable("MQ_SSL_CIPHER_SUITE");

            // 创建连接工厂
            var connectionFactory = _factoryFactory.CreateConnectionFactory();
            connectionFactory.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, queueManager);
            connectionFactory.SetStringProperty(XMSC.WMQ_HOST_NAME, hostName);
            connectionFactory.SetIntProperty(XMSC.WMQ_PORT, port);
            connectionFactory.SetStringProperty(XMSC.WMQ_CHANNEL, channel);
            connectionFactory.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT);
            // 启用SSL
            connectionFactory.SetStringProperty(XMSC.WMQ_SSL_CIPHER_SUITE, cipherSuite);
            // 可选:禁用证书验证(仅测试用,生产环境不建议)
            // connectionFactory.SetBooleanProperty(XMSC.WMQ_SSL_INCLUDE_CERT_CHAIN, false);

            // 创建连接、会话
            using var connection = connectionFactory.CreateConnection();
            using var session = connection.CreateSession(false, AcknowledgeMode.AutoAcknowledge);
            
            _logger.LogInformation("成功通过SSL连接到MQ服务器");

            // 后续可创建生产者/消费者操作队列
            // var queue = session.CreateQueue("QUEUE_NAME");
            // var producer = session.CreateProducer(queue);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "SSL连接MQ失败");
        }
    }
}

public class MyInfo { }

4. 部署与网络配置

  • 确保Azure Function的出站网络允许访问MQ服务器的IP和端口:如果Function部署在VNet中,需配置NSG规则允许出站流量;如果是消费计划,可使用IP限制规则或者VNet集成。
  • 若需要客户端证书验证,将证书上传至Azure Function的证书库,通过证书Thumbprint在代码中读取并配置到连接工厂。

.NET Framework 4.8 版本配置步骤

1. 安装NuGet包与依赖DLL

  • 安装IBM MQ的.NET Framework兼容包:
Install-Package IBM.WMQ
  • 额外需要将MQ客户端的64位原生DLL添加到项目中,包括amqmdnet.dll、amqic64.dll,设置这些文件的复制到输出目录为「始终复制」。

2. 配置连接参数

同样在Azure Function的应用设置中添加参数,与.NET 6一致,代码中通过Hashtable配置MQ属性。

3. 代码实现示例

using IBM.WMQ;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using System.Collections;

public class MQFrameworkFunction
{
    [FunctionName("MQSSLConnectFramework")]
    public void Run([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer, ILogger log)
    {
        try
        {
            var queueManagerName = Environment.GetEnvironmentVariable("MQ_QUEUE_MANAGER");
            var hostName = Environment.GetEnvironmentVariable("MQ_HOST_NAME");
            var port = int.Parse(Environment.GetEnvironmentVariable("MQ_PORT"));
            var channel = Environment.GetEnvironmentVariable("MQ_CHANNEL");
            var cipherSuite = Environment.GetEnvironmentVariable("MQ_SSL_CIPHER_SUITE");

            Hashtable properties = new Hashtable();
            properties.Add(MQConstants.HOST_NAME_PROPERTY, hostName);
            properties.Add(MQConstants.PORT_PROPERTY, port);
            properties.Add(MQConstants.CHANNEL_PROPERTY, channel);
            properties.Add(MQConstants.SSL_CIPHER_SUITE_PROPERTY, cipherSuite);
            properties.Add(MQConstants.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_CLIENT);

            // 创建队列管理器连接
            using var queueManager = new MQQueueManager(queueManagerName, properties);
            
            log.LogInformation("成功通过SSL连接到MQ服务器");

            // 后续操作队列
            // var queue = queueManager.AccessQueue("QUEUE_NAME", MQC.MQOO_OUTPUT);
        }
        catch (MQException ex)
        {
            log.LogError($"MQ错误代码: {ex.ReasonCode}, 消息: {ex.Message}");
        }
        catch (Exception ex)
        {
            log.LogError(ex, "SSL连接MQ失败");
        }
    }
}

4. 部署注意事项

  • 部署时确认所有依赖DLL(包括原生DLL)都被包含在部署包中,可通过Azure Portal的「高级工具(Kudu)」查看site/wwwroot/bin目录下的文件。
  • 若遇到证书信任问题,可将MQ服务器的根证书导入到Azure Function的信任存储,或在代码中临时禁用证书验证(仅测试)。

常见问题排查

  • 找不到MQ相关DLL:检查NuGet包是否正确安装,DLL的「复制到输出目录」设置是否生效,部署包是否包含这些文件。
  • SSL握手失败:确认加密套件与MQ服务器配置一致,服务器证书未过期,且Function信任该证书(可导入根证书)。
  • 连接超时:检查MQ服务器是否允许Azure Function的IP访问,Function的出站网络规则是否开放对应端口。

内容的提问来源于stack exchange,提问作者Art

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:57:21