Azure网站/WebJob连接Solace服务器端口55555异常求助
解决Azure WebApp/WebJob连接Solace服务器卡住的问题
这问题我之前帮团队排查过类似的,Azure Web Apps/WebJobs的网络环境确实和本地IIS/控制台有不少差异,结合你已经做的排查,给你几个针对性的方向试试:
1. 确认Azure环境的出站网络权限
虽然平台团队排除了防火墙问题,但Azure Web App的沙盒环境对非标准端口(比如55555)的出站访问有隐性限制,尤其是未启用VNet集成的情况下。建议:
- 尝试将Solace服务器的监听端口切换为标准端口(如443,如果支持TLS连接的话)
- 配置Azure WebApp的VNet集成,让应用直接通过内网VPN通道访问Solace服务器,绕过公共网络的端口限制
2. 排查libsolclient.dll的依赖缺失
你已经把dll放在bin目录,但Azure的运行环境默认缺少Solace客户端依赖的VC++运行库。可以:
- 把Visual C++ Redistributable对应的dll(如
vcruntime140.dll、msvcp140.dll)打包到应用的bin目录一起部署 - 在Azure门户的配置 > 通用设置中开启“启用32位应用程序”(如果你的libsolclient是32位版本),避免64位环境下的依赖加载失败
3. 添加连接超时与重试配置
你的代码未设置连接超时,Azure网络延迟可能导致Connect()无限等待。修改SessionProperties补充以下配置:
SessionProperties sessionProps = new SessionProperties() { // 原有配置... ConnectTimeoutInMsecs = 10000, // 设置10秒连接超时,超时会抛出错误 ReconnectRetries = 5, // 调高重试次数 ReconnectRetryWaitInMsecs = 2000 // 每次重试间隔2秒 };
4. 强制生成Solace详细日志
你提到LogDelegate无法配合log4net,改用Solace自带的文件日志更容易排查问题,设置日志路径为Azure的默认日志目录:
ContextFactoryProperties cfp = new ContextFactoryProperties() { SolClientLogLevel = SolLogLevel.Debug, LogFilePath = @"D:\home\LogFiles\solace.log" // Azure WebApp的日志存储目录 };
部署后可以在Azure门户的日志流或Kudu控制台查看这个日志文件,能看到连接过程中的详细报错信息。
备选方案:改用Solace AMQP客户端
如果以上方法都无效,可以试试Solace的AMQP协议客户端,AMQP使用标准端口5672/5671,Azure环境对标准协议的兼容性更好,不容易出现连接卡住的情况。
修改后的完整代码示例
#region Initialize properties ContextProperties contextProps = new ContextProperties() { TimerResolutionInMsecs = 5000 }; SessionProperties sessionProps = new SessionProperties() { Host = ConfigurationManager.AppSettings["Host"], VPNName = ConfigurationManager.AppSettings["VPNName"], UserName = ConfigurationManager.AppSettings["UserName"], Password = ConfigurationManager.AppSettings["Password"], ReconnectRetries = 5, ReconnectRetryWaitInMsecs = 2000, ConnectTimeoutInMsecs = 10000 }; #endregion ContextFactoryProperties cfp = new ContextFactoryProperties() { SolClientLogLevel = SolLogLevel.Debug, LogFilePath = @"D:\home\LogFiles\solace.log" }; logger.Info("Going to create ContextFactory instance"); ContextFactory.Instance.Init(cfp); logger.Info("SolaceTestQueuePublish initializing..."); #region Create the Context context = ContextFactory.Instance.CreateContext(contextProps, null); { #region Create and connect the Session session = context.CreateSession(sessionProps, SolTest_OnMessage, SolTest_OnSessionEvent); { logger.Info("Solace Session Created."); try { logger.Info("Trying to connect to Solace now.."); ReturnCode returnCode = session.Connect(); if (ReturnCode.SOLCLIENT_OK == returnCode) { isSolaceConnected = true; logger.Info("Connected to Solace.Success!"); } else { logger.Info($"Failed to connect Solace! Error Code: {returnCode.ToString()}"); } } catch (Exception ex) { logger.Info($"Failed to connect Solace!Error: {ex.Message}; Stack: {ex.StackTrace}"); } } } #endregion
内容的提问来源于stack exchange,提问作者Arnab Sinha
相关产品推荐
相关产品推荐

