通用 (UWP) 应用程序中的 ConfigurationManager 和 AppSettings

ConfigurationManager and AppSettings in universal (UWP) app

我想在配置文件中存储一个 API 密钥而不将其签入源代码管理,并在我的 UWP 应用程序中读取数据。

一个常见的解决方案是将密钥存储在 .config 文件中(例如 app.configweb.config)并像这样访问它:

var apiKey = ConfigurationManager.AppSettings.Get("apiKey");

我正在开发通用 Windows (UWP) 应用程序,但无法访问包含 ConfigurationManager.

的 System.Configuration 命名空间

如何在 UWP 应用程序中访问 AppSettings? 或者,在 UWP 应用中访问配置数据的最佳方式是什么?

您不需要创建配置文件。 UWP 有一个 built-in 存储本地 settings/configurations 的解决方案。请查看本教程:

https://msdn.microsoft.com/en-us/library/windows/apps/mt299098.aspx

使用 ApplicationDataContainer,您将能够通过键获取一个值:

Object value = localSettings.Values["exampleSetting"];

我认为你所说的 "ApiKey" 是 API 给你生成访问令牌的静态密钥。如果是这种情况,也许实现此目的的最佳方法是在源代码管理之外创建一个静态 class,其中包含该值,如下所示:

public static class MyCredentials
{
    public static string MyApiKey = "apiKey";
}

然后您可以从您的代码轻松访问该值:

var myApiKey = MyCredentials.MyApiKey;

如果您想将值存储在 plain-text 文件中,您将不得不使用 StorageFileFileIO classes 手动 write/read 它。

相反,如果 "ApiKey" 表示动态访问令牌,那么最好的解决方案是使用 ApplicationDataContainer,如 stratever 所说。

在我的特定用例中,我需要使用源代码管理未跟踪的外部文件。有两种方法可以从资源文件或配置文件中访问数据。

一是打开并解析一个配置文件。给定一个带有 Build Action Content 的文件 sample.txt复制到输出目录 无关紧要),我们可以阅读它与

var uri = new System.Uri("ms-appx:///sample.txt");
var sampleFile = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(uri);

var packageFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
var sampleFile = await packageFolder.GetFileAsync("sample.txt");

接着是

var contents = await Windows.Storage.FileIO.ReadTextAsync(sampleFile);

或者,我们可以使用 资源。向项目添加一个新的资源项,名为 resourcesFile.resw。要访问数据,请使用:

var resources = new Windows.ApplicationModel.Resources.ResourceLoader("resourcesFile");
var token = resources.GetString("secret");

我在博客里写了更详细的回答postCustom resource files in UWP

这是一个老问题,但这里是我的解决方案:

  • 使用您需要的所有属性创建部分 class Config.cs(例如)
  • 添加分部方法void Init()
  • 在构造函数中调用Init
  • 创建另一个文件 Config.partial.cs 使用 void Init() 方法填充您的所有属性

-> 使用#if DEBUG / #else / #endif 从 Debug/Release 切换 -> 使用 exclude Config.partial.cs from Github 不将其导入存储库

现在它可以编译并且不在存储库中 或者,您可以设置 Config.cs 默认(非机密)数据。

Config.cs :

public partial class Config
{

  public Config()
  {
      Init();
  }

  partial void Init();

  public string ApiKey{ get; private set; }= "DefaultValueAPIKEY";
}

Config.partial.cs

public partial class Config 
{

  partial void Init()
  {
#if DEBUG

    this.ApiKey = "DebugAPIKEY";

#else

    this.ApiKey = "ReleaseAPIKEY";

#endif
  }
}