Утешение подключения с веб-сайтов Azure - PullRequest
0 голосов
/ 09 мая 2018

Возникает проблема при попытке подключиться к серверу / порту Solace (55555), когда код развернут как веб-сайт Azure или WebJob. Сервер Solace находится в сети, хотя и подключен через VPN. Тот же код прекрасно работает при развертывании на локальном IIS / в качестве консольного приложения. Сеанс создается, но когда встречается оператор Connect (), он не выполняется и не выдает ошибку. Что сделано:

  1. Закрытие порта / проблемы с брандмауэром были исключены путем проверки с командой платформы
  2. LogLevel был установлен на Debug , и на события для Context, Session & Message были подписаны, но код не подходит ни к одному из этих событий. Также не удалось настроить метод LogDelegate для работы с методами log4Net.
  3. Согласно документации Solace, нам нужно поместить libsolclient.dll в тот же путь, что и SolaceSystems.Solclient.Messaging (в папке 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
    

1 Ответ

0 голосов
/ 10 мая 2018

Похоже, что проблема связана с ограничением Песочницы. Все веб-приложения Azure (а также мобильные приложения / службы, веб-задания и функции) работают в безопасной среде, называемой песочницей. Каждое приложение запускается в своей собственной изолированной программной среде, изолируя его выполнение от других экземпляров на том же компьютере, а также обеспечивая дополнительную степень безопасности и конфиденциальности, которые в противном случае были бы недоступны.

Единственный способ получить доступ к приложению через Интернет - через уже выставленные порты HTTP (80) и HTTPS (443); приложения могут не прослушивать на других портах пакеты, поступающие из Интернета. Однако приложения могут создать сокет, который может прослушивать соединения из песочницы. Например, два процесса в одном приложении могут связываться друг с другом через сокеты TCP; Попытки подключения, поступающие извне «песочницы», хотя они и находятся на одной машине, не будут выполнены. Подробнее об этой теме см. В разделе «Сетевые ограничения / соображения».

Ссылка: https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#network-endpoint-listening

...