Azure 网站的安慰连接
Solace connectivity from Azure Web sites
当代码部署为 Azure 网站或 WebJob 时,我在尝试连接到 Solace server/port(55555) 时遇到问题。 Solace 服务器在网络内,但通过 VPN 连接。
当作为控制台应用程序部署在本地 IIS/ 上时,相同的代码工作正常。
Session创建了,但是遇到Connect()语句,不执行,也不报错。
已完成的内容:
- 端口 Closure/Firewall 问题已通过平台团队检查排除
- LogLevel 已设置为 Debug 并且已订阅 Context、Session 和 Message 的事件,但代码没有处理这些事件中的任何一个。此外,无法将 LogDelegate 方法设置为使用 log4Net 方法。
根据 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
当代码部署为 Azure 网站或 WebJob 时,我在尝试连接到 Solace server/port(55555) 时遇到问题。 Solace 服务器在网络内,但通过 VPN 连接。 当作为控制台应用程序部署在本地 IIS/ 上时,相同的代码工作正常。 Session创建了,但是遇到Connect()语句,不执行,也不报错。 已完成的内容:
- 端口 Closure/Firewall 问题已通过平台团队检查排除
- LogLevel 已设置为 Debug 并且已订阅 Context、Session 和 Message 的事件,但代码没有处理这些事件中的任何一个。此外,无法将 LogDelegate 方法设置为使用 log4Net 方法。
根据 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