【问题标题】:Retrieve connection string to Azure storage in ASP.NET 5 / MVC 6在 ASP.NET 5 / MVC 6 中检索到 Azure 存储的连接字符串
【发布时间】:2016-12-16 19:02:44
【问题描述】:

我正在尝试检索 Azure 存储帐户的连接字符串,该帐户以这种方式在 config.json 文件中定义(在使用解决方案资源管理器选项“添加连接的服务...”添加它之后):

"MicrosoftAzureStorage": {
    "almacen_AzureStorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=almacen;AccountKey=pLrQwW......"

}

按照 Microsoft 的说明(与 MVC 5 配合得很好),您这样做是为了检索连接字符串:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("almacen_AzureStorageConnectionString"));

但 CloudConfigurationManager.GetSetting(...) 始终返回 null。 在中间窗口中调试和尝试时,我得到这个调用的输出:

?CloudConfigurationManager.GetSetting("almacen_AzureStorageConnectionString")
Exception thrown: "System.IO.FileNotFoundException" in mscorlib.dll
Exception thrown: "System.IO.FileNotFoundException" in mscorlib.dll
Getting "almacen_AzureStorageConnectionString" from ServiceRuntime: FAIL.
Getting "almacen_AzureStorageConnectionString" from ConfigurationManager: FAIL.

我使用的是 RC1 版本,并且包含了对 Microsoft.Extensions.Configuration 和 Microsoft.Extensions.Configuration.Json 包的引用。

编辑

对于下面的 cmets,我假设 CloudConfigurationManager 无法从 config.json 获取连接字符串...所以,从配置中检索连接字符串到 azure 存储的正确程序是什么.json 以“添加连接的服务...”对话框留下的方式?

【问题讨论】:

    标签: asp.net-core asp.net-core-mvc


    【解决方案1】:

    CloudConfigurationManager 不理解 config.json。您正在使用 2 种不同的配置系统。

    【讨论】:

    • 那么我必须坚持使用 ConfigurationManager 吗?
    • 我很困惑。你在用新的配置系统吗?
    • 使用新的配置系统,我必须创建两个类并注册一个中间件,只是为了传递一个配置参数......(模仿 config.json 文件的结构,就像它留下的方式一样“添加连接的服务...”选项)我不太喜欢,但似乎这就是 ASP.NET 5 中的一切,所有依赖注入,各种接口......还有其他选择吗?跨度>
    • 不确定你的意思。你能给我看一个代码示例吗?
    • 我的意思是解决方案资源管理器中的“添加连接的服务...”选项在 config.json 中创建了一个名为“MicrosoftAzureStorage”的键,而该键又具有另一个名为“mystoragename_AzureStorageConnectionString”的键,它的值是实际的连接字符串。要使用 IOptions 接口检索它,我必须创建两个 POCO 来模仿这种结构,将它们注册到管道上,然后将它们注入控制器。这一切只是为了阅读一个设置!有更简单的方法还是我错过了什么?
    【解决方案2】:

    大卫确实回答了你的问题,哈哈哈。但是,是的,恕我直言,所有这些 DI 对于小型项目来说都是疯狂的,但这是新常态。 (这在几个不同的地方得到了回答,随着各种测试版的变化,它已经有了一点变化)使用 RC1 这就是我所做的:

    settings.json中的连接字符串,

    "MicrosoftAzureStorage": {
        "xxxxxx_AzureStorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=xxxxxx;AccountKey=SuperSecretKey==;BlobEndpoint=https://xxxxxx.blob.core.windows.net/"
    }
    

    创建了一个名为AzureSettings的类

    public class AzureSettings
    {
        public string xxxxxx_AzureStorageConnectionString { get; set; }
    }
    

    在Startup.cs的ConfigureServices中添加,我放在AddMvc()之后

    services.Configure<AzureSettings>(Configuration.GetSection("MicrosoftAzureStorage"))
    

    然后在我的控制器中

    public class MyController : Controller
    {
        private string _AzureConnectionString;
    
        public ImagesController(IOptions<AzureSettings> settings)
        {
            _AzureConnectionString = settings.Value.xxxxxx_AzureStorageConnectionString;
        }
    

    然后这部分应该看起来很熟悉;)

    // GET: /<controller>/
    public IActionResult Index()
    {
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
        _AzureConnectionString);
    
        // Create a blob client.
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    
        // Do stuff
    
        return View();
        }
     }
    

    【讨论】:

      【解决方案3】:

      有点晚了,但是自从我提出这个问题后,有人认为实现一种更简单的方法来检索连接字符串是明智的。所以我会回答我自己的问题,因为现在你可以这样做:

      string conn = Configuration.GetConnectionString("ExampleConnection");
      

      如果您之前在 appsettings.json 中以这种方式声明过,请在 ConfigureServices 方法中:

      "ConnectionStrings": {
          "ExampleConnection": "blah,blah..."
      },
      

      注意:您必须添加对 Microsoft.Extensions.Configuration 的引用才能使此静态方法起作用。

      【讨论】:

        猜你喜欢
        • 2014-06-29
        • 2023-03-05
        • 2016-04-06
        • 2021-11-11
        • 1970-01-01
        • 2015-08-12
        • 1970-01-01
        • 2015-12-02
        • 1970-01-01
        相关资源
        最近更新 更多