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

24

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

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

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

我正在开发一个通用Windows (UWP)应用程序,无法访问包含ConfigurationManager的System.Configuration命名空间。

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


你能添加System.Configuration作为引用吗? - Robert
1
不,它在 https://gyazo.com/b1a6d73eb324397be66b4d38b68dd964 或对象浏览器中都不可用作参考。 - Amadeusz Wieczorek
4个回答

19
在我的具体使用情况中,我需要使用一个未经源代码控制跟踪的外部文件。有两种方法可以访问资源或配置文件中的数据。
其中一种方法是打开并解析配置文件。假设有一个文件名为sample.txt,其生成操作(Build Action)Content(无需关心复制到输出目录(Copy to Output Directory)),我们可以通过以下方式读取它:
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");

我在博客文章中写了更详细的答案《UWP中的自定义资源文件》


我并不清楚这如何解决“不检入源代码控制”的要求,因为您需要将文件添加到项目中以设置其构建操作,从而使其从源代码控制中排除变得相当繁琐。 - Gabriel Rainha
@GabrielRainha,这并不是问题的实际要求 - 如果您仔细阅读,您会发现OP已经指定了他在使用app.config文件时*已经有一种方法来完成此操作。-- 因此,他只需要知道在app.config文件之外使用什么。-- 遗憾的是,他没有与我们分享他的方法。 - BrainSlugs83
我在应用程序的根目录下遇到了一个文件未找到异常问题,所以我按照这里的建议进行了操作:通用 Windows 平台中的文件未找到异常 - Emy Blacksmith
在源代码控制未跟踪的文本文件中存储的意义是什么??在您的应用程序部署后,任何人都可以转到安装文件夹并查看所有内容,如果您不认真保护您的密钥,为什么不将文本文件包含在源代码控制中以免遭受一些痛苦。 - Soumya Mahunt

2
最初的回答:

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

  • 创建一个名为 Config.cs 的部分类 (例如),包含所有你需要的属性
  • 添加一个 partial 方法 void Init()
  • 在构造函数中调用 Init
  • 创建另一个文件 Config.partial.cs,并填写 void Init() 方法以填充所有属性

-> 使用 #if DEBUG / #else / #endif 切换 Debug/Release -> 使用 exclude Config.partial.cs 从 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
  }
}

0

我认为你所说的“ApiKey”是API提供给你生成访问令牌的静态密钥。如果是这样的话,也许最好的方法是从源代码控制中创建一个静态类,并将该值放在其中,就像这样:

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

然后你可以轻松地从你的代码中访问该值:

var myApiKey = MyCredentials.MyApiKey;

如果您想将值存储在纯文本文件中,那么您将不得不使用StorageFileFileIO类手动编写/读取它。

相反,如果“ApiKey”表示动态访问令牌,则最好的解决方案是像stratever所说的那样使用ApplicationDataContainer


1
感谢@ garolad的建议,使用FileIO类。我发布了一个使用此类的答案。 - Amadeusz Wieczorek

-2

谢谢@stratever。如果我想读取在运行时创建的数据,这个方法可以使用。但是我需要使用与应用程序捆绑在一起的数据(但未检入源代码控制)。 - Amadeusz Wieczorek
3
@stratever - 这不是用于应用程序配置数据的,而是更多用于诸如用户喜好之类的内容。 - kdazzle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接