Azure 网站的安慰连接

Solace connectivity from Azure Web sites

当代码部署为 Azure 网站或 WebJob 时,我在尝试连接到 Solace server/port(55555) 时遇到问题。 Solace 服务器在网络内,但通过 VPN 连接。 当作为控制台应用程序部署在本地 IIS/ 上时,相同的代码工作正常。 Session创建了,但是遇到Connect()语句,不执行,也不报错。 已完成的内容:

  1. 端口 Closure/Firewall 问题已通过平台团队检查排除
  2. LogLevel 已设置为 Debug 并且已订阅 Context、Session 和 Message 的事件,但代码没有处理这些事件中的任何一个。此外,无法将 LogDelegate 方法设置为使用 log4Net 方法。
  3. 根据 Solace 文档,我们需要将 libsolclient.dll 放在与 [=32= 相同的路径中](在bin文件夹中) 代码示例如下:

    #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 = 2
            };
            #endregion
    
            ContextFactoryProperties cfp = new ContextFactoryProperties()
            {
                // Set log level.
                SolClientLogLevel = SolLogLevel.Debug
            };
    
            //SolLogInfo logInfo = new SolLogInfo()
            //logInfo.LoggerName = logger.Logger.Name;
            //cfp.LogDelegate(logger.Info);
            logger.Info("Going to create ContextFactory instance");
            // Must init the API before using any of its artifacts.
            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);
                        //throw;
                    }
    
    
                }
    
                //session.Dispose();
                #endregion
            }
            //context.Dispose();
            #endregion
    

问题似乎是由于沙盒限制引起的。所有 Azure Web 应用程序(以及 Mobile App/Services、WebJobs 和 Functions)运行 都在称为沙箱的安全环境中。每个应用程序 运行 都在自己的沙箱中,将其执行与同一台机器上的其他实例隔离开来,并提供额外的安全性和隐私性,否则将无法获得。

通过 Internet 访问应用程序的唯一方法是通过已经公开的 HTTP (80) 和 HTTPS (443) TCP 端口;应用程序可能不会在其他端口上侦听来自 Internet 的数据包。 但是,应用程序可能会创建一个套接字,它可以侦听来自沙箱内的连接。例如,同一个应用程序中的两个进程可以通过 TCP 套接字相互通信;来自沙箱外部的连接尝试,即使它们在同一台机器上,也会失败。 有关此主题的详细信息,请参阅文档“网络 Restrictions/Considerations”部分。

参考:https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#network-endpoint-listening