【问题标题】:How to define connection string for session state in Azure如何在 Azure 中为会话状态定义连接字符串
【发布时间】:2016-06-02 10:16:13
【问题描述】:

我正在使用RedisSessionStateProvider 使用这样的程序https://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-session-state-caching/

我在web.config中定义了它的连接字符串,在这个例子中是XXXXXX

 <system.web>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.5" />
    <globalization culture="es-CO" uiCulture="es" />
    <customErrors mode="Off" />
    <sessionState mode="Custom" customProvider="SessionStateStore">
      <providers>
        <add name="SessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" connectionString="XXXXXX" throwOnError="true" applicationName="NominappSession" />
      </providers>
    </sessionState>
  </system.web>

我不想将连接字符串放在源代码中。那么如何使用 Azure 中的设置来定义这个连接字符串呢?

我从 github 部署到 azure,所以它使用 Kudu。我没有外部 CI 服务器。

有什么建议吗?

【问题讨论】:

  • 请注意,Azure 应用设置成为环境变量。因此,如果连接字符串配置条目支持扩展 env 变量(例如 connectionString="%MY_CONN_STRING%"),那么您也许可以做到这一点。或者也许有一个 API 可以让您以编程方式设置 conn 字符串,这也可以让您从 env 变量中设置它。请注意确定是否可能,但只是一些想法......

标签: azure azure-web-app-service stackexchange.redis session-state-provider


【解决方案1】:

如果您只想从源代码中提供连接字符串,可以在配置中使用settingsClassNamesettingsMethodName 属性,如下所示:

 <sessionState mode="Custom" customProvider="RedisSessionStateStore">
  <providers>
      <add
        name="RedisSessionStateStore"
        type="Microsoft.Web.Redis.RedisSessionStateProvider"
        settingsClassName="MyApp.SessionStateRedisSettings,MyApp"
        settingsMethodName="ConnectionString" />
  </providers>

在这里,settingsClassName 是您的应用中的一个类的名称,具有完全限定的命名空间。 settingsMethod名称是这个类上的方法名,必须是静态的,取0个参数,返回一个字符串。例如:

namespace MyApp
{
    public static class SessionStateRedisSettings
    {
        public static string ConnectionString()
        {
            return "ConnectionString goes here";
        }
    }
}

从这里:https://github.com/Azure/aspnet-redis-providers/wiki/Configuration

【讨论】:

  • 如果你的配置不在配置文件中,这个解决方案非常好,例如Azure KeyVault。
【解决方案2】:

我做到了:)

为此,您需要将连接字符串定义为环境变量,而不是典型的连接字符串。并在会话状态下提供使用环境变量名称。

这边:

  <appSettings>
    <add key="REDIS_CONNECTION_STRING" value="redis,allowAdmin=true" />
  </appSettings>
  <system.web>
    <sessionState mode="Custom" customProvider="SessionStateStore">
      <providers>
        <add name="SessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" connectionString="REDIS_CONNECTION_STRING" applicationName="REDIS_SESSION_APPLICATION_NAME" throwOnError="true" />
      </providers>
    </sessionState>
  </system.web>

现在可以使用它在 Azure 网站的应用设置中定义连接字符串

【讨论】:

【解决方案3】:

我觉得IPartitionResolver可以来这里解救……

你基本上可以创建一个实现System.Web.IPartitionResolver接口的类,并在web.config中的sessin状态配置中指定为this

<sessionState mode="Custom"  partitionResolverType="WebAppConnectionStringResolver">

然后在类中你可以覆盖连接字符串

public class WebAppConnectionStringResolver : System.Web.IPartitionResolver
{
   public void Initialize()
   {

   }

   public string ResolvePartition(object key)
   {
     return System.Configuration.ConfigurationManager.ConnectionStrings["your_Conn_string_name_in_portal"]
   }
}

我还没有对此进行测试,但我相信这应该可以工作

阅读更多内容

【讨论】:

    【解决方案4】:

    请查看 Scott Hanselman 关于该主题的博客: http://www.hanselman.com/blog/HowToKeepYourASPNETDatabaseConnectionStringsSecureWhenDeployingToAzureFromSource.aspx

    您可以将连接字符串存储在 Azure 门户内的应用设置中,然后从您的应用中调用它们。这可以防止字符串包含在您的源代码中。您也希望对存储密钥执行相同的操作。

    在门户中转到您的应用程序设置,然后选择“应用程序设置”。在该窗格中向下滚动到连接字符串。

    也请查看此页面的连接字符串部分: https://azure.microsoft.com/en-us/documentation/articles/web-sites-configure/

    【讨论】:

    • 这不能回答问题,它适用于标准连接字符串和设置,但不适用于会话状态中的连接字符串
    猜你喜欢
    • 2023-04-07
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    相关资源
    最近更新 更多