2017-12-13 7 views
1

コアフォルダから別のプロジェクトを参照するazure関数アプリケーションで作業していて、そのプロジェクトには以下のクラスが含まれています。関数がazureにデプロイされているときにappsettings.jsonファイルを読み込めませんでした

appsettings.jsonファイルを読み込もうとしていて、ローカルで正常に動作しますが、Azureポータルにデプロイされているときにこのファイルが見つかりませんでした。ビルダー.Build()メソッドはFileNotFoundExceptionをスローします。

public static class ConfigurationSettings 
{ 
    public static IConfigurationRoot GetConfigurationRoot() 
    { 

     var builder = new ConfigurationBuilder() 
         .SetBasePath(Directory.GetCurrentDirectory()) 
         .AddJsonFile("appsettings.json"); 

     return builder.Build(); 
    } 
} 

誰も私がここでやって何が間違っ私を示唆し、紺碧の機能のアプリ内のファイルを含めるために他ありことはできますか?

+0

アンサーではなく、より多くのヒント。アプリケーションの設定値を読み込むために 'appsettings.json'ファイルを使用しないでください。 'ConfigurationManager'のような利用可能な適切な機能を使用し、手動またはVSTSのようないくつかのデプロイメントツールで設定されたアプリケーション設定を使用してください –

+0

私はカスタム・プロバイダを作成した後、 appsettings.json 'が見つかりませんでした。オプションではありません。物理パスは' D:\ Program Files(x86)\ SiteExtensions \ Functions \ 1.0.11388 \ appsettings.json 'です。それは、紺碧のポータルでコードが実行されている場所からファイルを見ていますが、私はそれがコンテンツルート内のファイルを探すと思います。それは通常の.netコアプロジェクトでしたが、私はIhostingEnvironmentを使って実現できましたが、関数appの場合にはうまくいくかどうかはわかりません。 –

+0

@Jan_V私はappsettings.jsonファイルを使用すべきではないことを知っていますが、私のプロジェクトはクラスを起動していないし、いくつかのプロジェクト設定をバインドするためにこれが私が今考えることができる唯一の方法です。 –

答えて

2

関数がAzureで実行されるとき、GetCurrentDirectoryD:\Windows\system32に設定されます。そのフォルダにはappsettings.jsonがありません。したがって例外です。

ライブラリがロードされているディレクトリを設定できることを願っています。その場合は、タイプExecutionContextの関数に追加のパラメータを追加し、そのFunctionDirectoryプロパティを使用する必要があります。 docsを参照してください。

もちろん、appsettings.jsonを展開の一部としてAzureに公開することを忘れないでください。

+0

appsettings.jsonは、runメソッドを実行する私の関数appの一部ですが、別のクラスライブラリからappsettings.jsonファイルをロードしています。機能性アプリを公開してすべてのファイルとフォルダがすべての参照を含めてコピーされると、ポータルからコンテンツをダウンロードするとファイルが表示されますが、これがコピーされるとappsettings.jsonのパスが何かわかりませんこのファイルの修正パスを設定できるかどうかはわかりません。 –

+0

私はそれを持っていると思う、あなたの答えは私のために働いたメソッドを実行するためにもう一つのパラメータExecutionContextを渡して、私はファイルの場所を取得するためにFunctionDirectoryプロパティを使用しました。 –

0

私は今、関数appを実行し、appsettings.jsonファイルを読むことができます。ここで私はこれを達成する方法である:

クラスライブラリプロジェクトの静的プロパティSettingsTypeとも埋め込まappsettings.jsonファイルへ

作成したカスタム設定プロバイダCustomConfigurationProvider、割り当てられたタイプ:

public class CustomConfigurationProvider : ConfigurationProvider, IConfigurationSource 
{ 
    public static Type SettingsType; 
    public override void Load() 
    { 
     var JsonString = GetResponse("appsettings.json"); 
     var jsonObject = JObject.Parse(JsonString); 
     foreach (var settingsGroup in jsonObject) 
     { 
      var settingsGroupName = settingsGroup.Key; 
      foreach (var setting in settingsGroup.Value) 
      { 
       var jProperty = setting as JProperty; 
       Data.Add($"{settingsGroupName}:{jProperty.Name.ToString()}", jProperty.Value.ToString()); 
      } 
     } 
    } 

    public IConfigurationProvider Build(IConfigurationBuilder builder) 
    { 
     return this; 
    } 

    protected string GetResponse(string resourceName) 
    { 
     var assembly = SettingsType.Assembly; 
     var resourceStream = assembly.GetManifestResourceStream(SettingsType.Namespace+'.'+ "appsettings.json"); 
     using (var reader = new StreamReader(resourceStream, Encoding.UTF8)) 
     { 
      return reader.ReadToEnd(); 
     } 
    } 
} 

が、それは私が、まだのために働いていますそれを行うためのより良い方法を探しています。

関連する問題