web-dev-qa-db-ja.com

Asp.Net Core AppのWeb.config設定にアクセスしますか?

Asp.netコアには、非常に柔軟で優れた新しい構成システムがあることを理解しています。しかし、.net 4.xのweb.configベースの構成システムには、私が気に入っていることがあります。たとえば、xmlファイルであるため、web.configファイルにコメントを挿入できます。そして、それは私にとって光沢のある新しいjsonアプローチを採用するのではなく、xmlに固執する価値があります。 [pdate: jsonアプローチはファイル内のコメントもサポートすることを理解しました。]

したがって、完全なフレームワークを対象とするAsp.Net Core Web Projectがある場合、web.configベースのSystem.Configuration.ConfigurationManager.AppSettings[key]アプローチを使用して設定を取得できるはずです。

しかし、試してみると、値は常にnullに戻ります(少なくともIIS VS2015を使用して表現する場合)。

正常に動作するはずです私が見ているかもしれないものについて何か考えはありますか?

Web.config

<configuration>
    <appSettings>
        <add key="SomeSetting" value="true"/>
    </appSettings>

    <system.webServer>
        <handlers>
            <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
        </handlers>

        <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
     </system.webServer>
</configuration>

設定にアクセスするコード:

string key = "SomeSetting";
string setting = ConfigurationManager.AppSettings[key];
if (setting == null)
       throw new Exception("The required configuration key " + key + " is missing. ");

UPDATE
さらに調査を重ねた結果、なぜ動作しないのか理解できましたが、まだ修正する方法が見つかりませんでした。根本的な原因は、ConfigurationManagerがweb.configではなく別のファイルで構成情報を検索しているためと思われます。

これは、AppDomain.CurrentDomain.SetupInformation.ConfigurationFileプロパティを見るとわかります。私の場合、website_folder\web.configを指すのではなく、website_folder\bin\Debug\net461\win7-x64\wwwGiftOasisResponsive.exe.Configを指します。website_folderは、私のWebサイトを含むフォルダーへのパスです。

ドキュメントとインテリセンスでは、AppDomain.CurrentDomain.SetupInformation.ConfigurationFileは設定可能なプロパティですが、試してみると、設定しても値が変わらないことがわかりました。非常に奇妙な。

だから私は今、問題が何であるかを見ている間、私はそれを修正する方法を見つけることができないようです。

33
Ron C

私はちょっと解決策を見つけました。理解の鍵は、AppDomain.CurrentDomain.SetupInformation.ConfigurationFileプロパティがweb.configファイルではなく、Webサイトを実行する実行可能ファイルのexe.configファイルを指していることを認識することでした。 .netコアの下では、Webサイトは独自のプロセスで実行され、独自のexeがあります。

したがって、.Net 4.xがConfigurationManagerで使用する構成モデルは、4.x Webアプリケーションよりもデスクトップアプリのモデルに似ています。つまり、web.configではなくexe.configを見ているということです。

次に、Asp.Net Core Web Project(フレームワーク全体を使用)には、デスクトップアプリと同じようにapp.configファイルが含まれていることに気付きました。そして、デバッグ用かリリース用かにかかわらず、.net 4.xアプリケーション構成設定をそのファイルに配置すると、exeが生成されるときにexe.configファイルに配置されることがわかります。たとえば、Win Formsアプリとまったく同じように機能します。

したがって、完全なフレームワークを対象とするasp.netコアWebアプリケーションでConfigurationManagerを利用する方法は、web.configファイルではなくapp.configファイルにアプリケーション設定を置くことです。 ConfigurationManagerはそれらを問​​題なく見つけます。

enter image description here

これは多くのことを説明しますが、それらの設定を実際にweb.configに配置し、ConfigurationManagerを介してそれらにアクセスする機能をまだ提供していません。しかし、完全なフレームワークを対象にしている場合でも、asp.netコアWebアプリケーションではそれが不可能だと考え始めています。

36
Ron C

私もこの問題に遭遇しました。いくつかの調査と読み取りの後、web.configを手動で追加できるようになりますが、これはIISの設定を提供するためです(たとえば、認証など)。

Appsettingsまたはカスタム設定については、appsettings.jsonファイルと.Net Coreの新しい構成を操作する必要があります。

Microsoftドキュメント

3
jawa

Asp.net core 1.1アプリケーションをIISに公開し始めたときに、この問題に遭遇しました。
発行時に上書きされたIISにweb.configファイルが生成されます。 Windows認証を有効にするには、プロジェクトにweb.configを手動で追加する必要がありました。これはIISに正しく公開されます:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\yourproject.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    <security>
      <authentication>
        <anonymousAuthentication enabled="false" />
        <windowsAuthentication enabled="true" />
      </authentication>
    </security>
  </system.webServer>
</configuration>
3
Yush0