我创建了一个.Net Core API,我引用了一个.Net框架应用程序。引用的Application连接到数据库,其连接字符串存储在web.config文件中:
string CONNSTR =ConfigurationManager.ConnectionStrings["SHOPPINGCNN"].ConnectionString;
.Net Core应用程序使用appsettings.json而不是web.config文件。当我运行API并尝试使用引用的应用程序资源时,上面的代码将被触发并返回null,因为.net Core应用程序中不存在web.config文件。解决此问题的最佳解决方案是什么
在.net核心中,您可以使用ConfigurationBuilder
来读取appsettings.json文件。
你可以实现如下。
appsettings.json样本
{
"option1": "value1_from_json",
"option2": 2,
"ConnectionStrings": {
"YourConnectionString": "............."
}
}
C#代码示例
static class YourClass
{
public static IConfigurationRoot Configuration;
public static string GetConnectionString()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
var connectionString = Configuration["ConnectionStrings:YourConnectionString"];
}
}
对于.NET Core应用程序,最好的方法是使用Configuration API。这是一种非常灵活的方式,并且由于提供者模式,它允许使用不同的源,不仅是最常见的appsettings.json
文件(顺便说一下只是一个JSON文件,可以随机命名):
- 文件格式(INI,JSON和XML)
- 命令行参数
- 环境变量
- 内存中的.NET对象
- 加密的用户存储Azure Key Vault
- 您安装或创建的自定义提供程序
现在关于ConfigurationManager
。起初,.NET Core被迫忘记了这个类 - 它没有被实现和支持,而且想法是通过提供新的Configuration API来完全取代它。
而且,实际情况是ASP.NET Core应用程序不再通过IIS托管(IIS现在主要用作反向代理),因此web.config
不再那么有用(除非您仍需要定义特定参数的极少数情况到IIS配置)。
虽然,在提供.NET Standard 2.0之后,这个System.Configuration.ConfigurationManager nuget包可用并带回ConfigurationManager
类。由于在新的.NET Core 2.0中实现了新的compatibility shim,因此成为可能。
关于你的情况,很难说为什么你有'null',因为它没有足够的信息:
由于.Net Core应用程序是自托管的,几乎可以在任何平台上运行,因此它们不再托管在ISS上。 .Net Core应用程序设置默认以Json
格式(appsettings.json
)存储,而.Net Framework应用程序配置以web.config
格式存储在XML
文件中。有关.Net Core应用程序的更多信息,您可以阅读Configuration in ASP.NET Core。在我的例子中,我试图从.Net Core 2.0程序集访问.Net Framework程序集的数据层。要实现这一点,不需要在.Net Core应用程序中安装System.Configuration.ConfigurationManager程序包,但只需要添加app.config
到.Net Core程序集然后添加连接字符串:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="SHOPPINGCNN" connectionString="server=your server name;integrated security=true;database=your database name" />
</connectionStrings>
</configuration>
一切都会好起来的。确保使用您在.Net Framework应用程序中使用的相同连接字符串名称(在我的情况下为SHOPPINGCNN
),否则您将无法获得所需的结果。我在我的项目中这样做了它100%工作
如果你错过了 - 并且因为@Zuhair似乎不想发布答案 - 这里是他们的解决方案的复制粘贴(我最初错过了它,因为它只是在评论中):
我找到了解决方案。我将Web.config的名称更改为app.config,然后我可以使用以下命令获取连接字符串:
System.Configuration.ConfigurationManager.ConnectionStrings [ “SHOPPINGCNN”]。ConnectionString的
app.config文件如下所示:
<?xml version="1.0"> encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="SHOPPINGCNN" connectionString="server=.\SQLEXPRESS;integrated security=true;database=xxxxx" />
</connectionStrings>
</configuration>
您还需要安装此NuGet包:
System.Configuration.ConfigurationManager
在我的情况下,我只是重命名了包含connectionString'app.config'的web.config并且它有效。
我意识到这可能不是一个好的长期解决方案,但对于混合遗留项目 - 或者开始学习.net核心它非常有用。