ConfigurationManager.AppSettings获取null值?

57

我没有意识到:'在一个单独的类库中有一个web.config,而且'是从不同的Web应用程序读取web.config应用设置。

我正在使用VS2010目标框架3.5

我不知道这里有什么问题,但是当我尝试获取ConfigurationManager.AppSettings["StoreId"];时,我得到了null

private string _storeid = GetStoreId;

public static string GetStoreId
{
    get
    {
        return ConfigurationManager.AppSettings["StoreId"];
    }
}

web.config:

<appSettings>
    <add key="StoreId" value="123" />
</appSettings>

这个是在你的主应用程序中吗?还是在类库中?或者是在Web应用程序或网站中? - marc_s
嗨@Nick,你能否请修正正确答案?已经过去7年了,我发布了一个更好的解决方案。 - Jeremy Thompson
13个回答

65
如果你正在进行单元测试,需要在单元测试项目中拥有APP.CONFIG副本

5
至少创建一个指向 App.Config 的快捷方式文件 - 通常情况下,除非通过版本控制系统,否则不应复制代码文件。如果可以,请尝试使用依赖注入(DI)和模拟 App.Config 在单元测试中实现。 - Jeremy Thompson
3
这是我的问题的解决方法。我必须从web.config中提取标签,并将它们放在app.config文件的<configuration>分支之间。这样做后,我的单元测试就开始正常运行了。 - John Waclawski
1
为什么我们要滚动这么远才能得到答案?有人可以把它往上移动吗? - Héctor Álvarez
2
我想我一定训练自己忽略任何带有大写锁定的帖子,因为一开始我直接滚过去了...然后又滚回来意识到这正是我问题的确切解决方案... - F1Krazy
我同意@JeremyThompson的观点。但是,我会把“shortcut”称为链接(link)。这意味着在另一个项目中创建文件的链接。我建议将配置文件简单地放在解决方案下的共享文件夹中,并通过在每个项目中添加链接文件来共享它。这就是在此解决方案中提到的内容(https://stackoverflow.com/a/60107554/4441211),我认为它是对此解决方案的补充。 - Eyal Gerber

23

更新

您可以在CsProj文件中使用AfterTargets来复制配置文件:

<Target Name="CopyAppConfig" AfterTargets="Build" DependsOnTargets="Build">
    <CreateItem Include="$(OutputPath)$(AssemblyName).dll.config">
         <Output TaskParameter="Include" ItemName="FilesToCopy"/>
    </CreateItem>
    <Copy SourceFiles="@(FilesToCopy)" DestinationFiles="$(OutputPath)testhost.dll.config" />
</Target>

问题

通常的原因是由于上下文所致。

原因

当你有一个包含两个项目的解决方案时,如果 App/Web.Config 文件在主项目中,那么如果运行应用程序的上下文是第二个项目,比如库、单元测试等,则它将无法工作。

困境

要从其他项目(使用 System.Configuration)中读取配置值,您需要将配置文件移动/复制到具有运行上下文的项目中。不幸的是,复制文件违反了良好编程的原则;面向对象编程、源代码管理、SOLID 等。

巧妙的解决方案

一个巧妙的解决方案是在其他项目中添加配置文件的快捷方式,这样您只需更新一个文件:

enter image description here

很希望能像回答 #2 中分享程序集文件一样优雅地将 config 文件的内容分配给项目,链接如下:https://dev59.com/q2Up5IYBdhLWcg3whn1z#15319582,但不幸的是这受制于上下文


3
同样适用于引用和调用类库的控制台应用程序。配置设置存储在控制台的 app.config 中,可以像 ConfigurationManager.AppSettings["myKey"] 这样从类库中调用。 - aponzani
1
被踩了。这只是在对症下药,而不是解决问题。这会使未来的更新容易出错,因为您可能希望为每个项目设置单独的配置值。 - Spikee
@Spukee,你能提供一个带有解决方案的答案吗? - Jeremy Thompson
@JeremyThompson:被接受的答案很好。我的主要关注点是,提供链接会让你产生虚假的安全感。分别维护每个文件需要更多的纪律性,但这从来不是坏事。这也意味着你非常清楚发生了什么,而不是“假设”一切都没问题。 - Spikee
2
被接受的答案还好吧 - 其实并不是解决方案。你可以看到在“解决方案资源管理器”中的文件其实是一个快捷方式,抱歉我不会为那些想要维护本质相同文件副本的人提供服务!新手。 - Jeremy Thompson

11

免责声明 ;) 本篇文章不是为了回答OP的问题,因为已经太晚了,但肯定会帮助到最终来到这个页面的读者。

我遇到的问题:在我的C# Web API项目中,ConfigurationManager.AppSettings["uName"] 返回null

我检查过的基本事项

1) 在代码中,ConfigurationManager.AppSettings["uName"] ,我使用的是与web.config文件中完全相同的键 'uName',

<appSettings>
      <add key="uName" value="myValue" />
</appSettings>

检查了一下,我没有把userName误打成uName之类的。

2) 由于这是一个Web API项目,所以它会有一个名为web.config而不是app.config的文件,并且该文件位于您项目的根文件夹中。[参考图片]。

enter image description here

解决办法

对我有效的解决方案是,

ConfigurationManager.AppSettings["uName"]更改为WebConfigurationManager.AppSettings["uName"]

并且

确保我

<appSettings>
          <add key="uName" value="myValue" />
</appSettings>

在正确的文件中,即ie.

正确的文件不是View文件夹中的web.config

也不是debug或release web.config

enter image description here


这是我的错误。我使用了错误的Web配置文件。AppSettings在另一个Web配置文件中。谢谢你的帮助 :) - Teyler Halama
@BernardV,很高兴能帮忙 :) !! - eRaisedToX

8

并且:

<appSettings>
    <add key="StoreId" value="123" />
</appSettings>

配置文件应该放在ASP.NET应用程序的web.config文件中,而不是在您在Visual Studio中添加到类库项目的app.config文件中,对吧?如果是这种情况,你不可能得到null。如果您将其添加到Visual Studio类库项目的app.config中,则获取null是完全正常的行为。


它位于我的 Web 应用程序的 web.config 文件中。 - Nick Kahn
7
值得注意的是,如果您正在运行代码测试工具,则它的 app.config 文件需要具有您正在查找的设置。 - KevinDeus

2

应用程序设置存储在ConfigurationManager.AppSettings中,但用户设置(在项目属性的属性设置中)不是如此。


2

我刚得到一个答案,DLL是从不在创建的项目中调用的,因此App.config中的条目应该移动到调用项目的配置文件中。

例如,我的解决方案中有两个项目,一个是类库,另一个是控制台应用程序。我已经在控制台应用程序中添加了类库引用。如果我在类库项目中添加app.config文件,则会抛出空异常,在控制台应用程序中添加app.config可以让它正常工作。希望这能解决问题。


2
在Visual Studio中,右键单击配置文件,选择属性,然后将“复制到输出目录”更改为“始终复制”或“仅在较新时复制”。
或者,手动将以下部分作为子元素添加到.csproj文件中的元素中(这是针对文件“App.config”的“始终复制”):
  <ItemGroup>
    <None Update="App.config">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>

1
我尝试了所有的解决方案,但都没有成功。我试图使用一个名为“web.config”的文件。一切都命名正确,文件位置也正确,但它就是不工作。然后我决定将我的“web.config”文件重命名为“app.config”,就这样,它就能正常工作了。
所以,如果你遇到了一个“web.config”文件的问题,请确保将其重命名为“app.config”。

0

这种情况发生在我测试一个类库 (.dll) 的时候。它们都在同一个项目中,但是类库的 App.config 文件有我需要的设置。我编写的测试应用程序需要这些设置,因为它正在运行该类库。


0

我遇到了这个问题,因为我从文件资源管理器中复制了一个项目并重命名了该项目。这样复制了Debug文件夹,由于我没有将其设置为“如果较新则复制”,它没有覆盖旧的App.config文件。

只需删除Debug文件夹并重新构建即可。希望能对某些人有所帮助。


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