2017-12-13 1 views
1

코어 폴더에서 다른 프로젝트를 참조하는 azure 함수에서 작업 중이며 해당 프로젝트에 아래 클래스가 포함되어 있습니다.azure에 기능이 배포 될 때 appsettings.json 파일을로드 할 수 없습니다.

이 appsettings.json 파일을 읽으려고하는데 로컬에서는 제대로 작동하지만 azure 포털에 배포하면이 파일을 찾을 수없고 builder.Build() 메서드가 FileNotFoundException을 throw합니다.

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

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

     return builder.Build(); 
    } 
} 

사람은 내가 푸른 기능 응용 프로그램에서 파일을 포함하는 다른 여기 일을하고있다하고 무슨 저를 제안 할 수 있습니까?

+0

anser가 아니지만 팁이 더 있습니다. 'appsettings.json' 파일을 사용하여 응용 프로그램의 구성 값을로드하지 마십시오. 'ConfigurationManager'처럼 사용 가능한 적절한 기능을 사용하고 수동 또는 VSTS와 같은 일부 배포 도구를 통해 설정되는 응용 프로그램 설정을 사용하십시오 –

+0

"구성 파일 '오류가 발생하기 시작한 후 사용자 정의 공급자를 만들었습니다. appsettings.json '을 찾을 수없고 선택 사항이 아닙니다. 실제 경로는'D : \ Program Files (x86) \ SiteExtensions \ Functions \ 1.0.11388 \ appsettings.json '입니다. " 그것은 코드가 하늘빛 포털에서 실행되고있는 파일을 찾았지만 콘텐츠 루트에서 파일을 찾은 것 같습니다. 그것은 정상적인 .net 핵심 프로젝트 난 IhostingEnvironment를 사용하여 얻을 수 있지만 기능 애플 리케이션의 경우에는 작동하지 않을 수 있는지. –

+0

@Jan_V 우리는 appsettings.json 파일을 사용하지 말아야한다는 것을 알고 있지만, 내 프로젝트에는 어떤 시작 클래스도없고 일부 프로젝트 설정을 바인드하는 것이 이것이 지금 생각할 수있는 유일한 방법입니다. –

답변

2

함수가 Azure에서 실행될 때 GetCurrentDirectoryD:\Windows\system32으로 설정됩니다. 해당 폴더에 appsettings.json이 없으므로 예외입니다.

라이브러리가로드되는 디렉토리를 설정할 수 있기를 바랍니다. 그렇다면 ExecutionContext 유형의 함수에 추가 매개 변수를 추가하고 FunctionDirectory 속성을 사용해야합니다. docs을 참조하십시오.

물론 배포의 일부로 Azure에 appsettings.json을 게시해야합니다.

+0

appsettings.json은 run 메소드를 실행하는 함수 app의 일부이지만 다른 클래스 라이브러리에서 appsettings.json 파일을로드하고 있습니다. 기능성 앱을 푸른 색으로 게시하면 모든 참조를 포함하여 모든 파일이 복사되고 폴더에서 콘텐츠를 다운로드해도 파일을 볼 수는 있지만 일단 복사되면 appsettings.json의 경로가 무엇인지 모릅니다. 하늘에 나는이 파일에 대한 몇 가지 수정 경로를 설정할 수 있는지 잘 모르겠습니다. –

+0

나는 그것을 얻은 것 같아, 당신의 대답은 나를 위해 일한 하나의 매개 변수 ExecutionContext를 전달하여 메서드를 실행 한 다음 FunctionDirectory 속성을 사용하여 파일 위치를 검색했습니다. –

0

이제 앱 기능을 실행하고 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(); 
     } 
    } 
} 

이 나를 여전히 위해 노력하고 있습니다 더 좋은 방법을 찾고 있습니다.

관련 문제