web-dev-qa-db-ja.com

.Net Coreアプリでweb.configファイルを読み取る方法

.Net Core APIを作成し、.Netフレームワークアプリケーションを参照しました。参照されるアプリケーションはデータベースに接続し、その接続文字列はweb.configファイルに保存されます。

    string CONNSTR =ConfigurationManager.ConnectionStrings["SHOPPINGCNN"].ConnectionString;

.Net Coreアプリケーションは、web.configファイルの代わりにappsettings.jsonを使用します。 APIを実行して、参照されたアプリケーションリソースを使用しようとすると、.net Coreアプリにweb.configファイルが存在しないため、上記のコードがトリガーされ、nullを返します。この問題を解決する最善の解決策は何ですか

17
Zuhair

.Net Coreアプリケーションは自己ホスト型であり、ほぼすべてのプラットフォームで実行できるため、ISSではホストされなくなりました。 .Net Coreアプリケーションの設定は、Json形式(appsettings.json)デフォルトでは、.Net Frameworkアプリケーションの構成はweb.configファイルはXML形式です。 .Net Coreアプリケーションの詳細については、 ASP.NET Coreの構成 を参照してください。私の場合、.Net Core 2.0アセンブリから.Net Frameworkアセンブリのデータレイヤーにアクセスしようとしていました。これを実現するために、 System.Configuration.ConfigurationManager パッケージをインストールする必要はありません。 .Net Coreアプリケーション。ただし、追加する必要があるのは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%動作します

10
Zuhair

.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"];

    }

}
10
hasan

.NET Coreアプリの場合、最良の方法は Configuration API を使用することです。これは非常に柔軟な方法であり、プロバイダーパターンのおかげで、最も一般的なappsettings.jsonファイル(ちなみにJSONファイルであり、ランダムな名前を付けることができます):

  • ファイル形式(INI、JSON、およびXML)
  • コマンドライン引数
  • 環境変数
  • インメモリ.NETオブジェクト
  • 暗号化されたユーザーストアAzure Key Vault
  • インストールまたは作成するカスタムプロバイダー

ConfigurationManagerについて。最初、.NET Coreはこのクラスを忘れることを余儀なくされました。実装もサポートもされていなかったため、新しい構成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」を持っている理由を言うのは困難です:

  • web.configの間違ったセクションである可能性があります
  • web.configが出力/公開フォルダーにコピーされない場合があります
7
Set

あなたがそれを見逃した場合-そして@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 Coreの学習を開始するためにドアを踏み入れるのは非常に便利です。

6
niico