2014-12-01 3 views
0

는 tldr는 - NServiceBus.Host.exe은NServiceBus 호스트 콘솔

구성 관리자를 사용하여, 나는 내가 프로젝트의 appSettings는 액세스 할 수 없습니다입니다 디버그 모드에서 내의 app.config를 탈취 코드 내에서 호출. 나는 NServiceBus 호스트 nuget 패키지 자체 호스트를 사용하고

, 버전은 4.4.2

namespace EnrollmentService.Reporting 
{ 
    public class EndpointConfig : IConfigureThisEndpoint, AsA_Server 
    { 
     public EndpointConfig() 
     { 
      //TODO: WHAT IS HAPPPEEENNIIINNNGG 
      var url = ConfigurationManager.AppSettings["configurationKey"]; 

      var config = ConfigurationManager.OpenExeConfiguration("EnrollmentService.Reporting.dll"); 

      var nsbHostConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     } 
    } 
} 

변수 'URL'다시 널 (null) 제공됩니다. 변수 'config'는이 응용 프로그램의 구성 컨텍스트로 사용됩니다. 'nsbHostConfig'변수는 응용 프로그램의 실제 구성 컨텍스트입니다.

다시 예상 경로는 "EnrollmentService.Reporting.dll.config"이지만 실제 경로는 "NServiceBus.Host.exe.config"입니다. NServiceBus 구성 파일이 없습니다.

이것은 다른 컴퓨터에서 "* .dll.config"를 사용하여 예상대로 작동하므로 컴퓨터 특정 문제 인 것 같습니다.

코드를 호출하는 실행 파일은 "실행중인"응용 프로그램의 구성이어야하지만 이전에는 예상 된 * .dll.config를 사용하고있었습니다. 또한 NServiceBus는 디버깅 목적으로 호스트가 콘솔 앱으로 실행되지만 배포의 경우 Windows 서비스로 설치되므로 NServiceBus가 구성 컨텍스트를 변경하게됩니다. 개발할 필요가있을 때마다 빈의 설정 파일을 바꿔야 할 필요는 어리석은 일입니다.

내 자체 호스트 응용 프로그램의 운영 컨텍스트가 NServiceBus 실행 파일의 구성을 사용하도록 전환하는 이유는 무엇입니까?

UPDATE : 아래

은, 무슨 일되어야한다,하지만 그것은 NServiceBus 소스 코드를 보면

https://github.com/Particular/NServiceBus.Host/blob/develop/src/NServiceBus.Hosting.Windows/EndpointTypeDeterminer.cs

아니라, 당신의 EndpointType가 지정되지 않은 경우를 app.config에서 EndpointTypeDeterminer.cs는 IConfigureThisEndpoint 유형에 대한 어셈블리 검색을 통해 EndpointType을 찾습니다. 즉, 구성 파일 경로는 다음

+0

귀하의 편집 내용을 이해하지만 귀하의 질문에 대한 대답 여부가 명확하지 않습니다. 유형 결정기가 올바른 어셈블리를 식별하지 못하게하는 엔드 포인트와 다른 점이 있습니까? 근본 원인에 관심이 있습니다. –

+0

그것은 내 질문에 대답하지 않는다. ** 나는 소스 코드에서 어떤 일이 일어나야 하는지를 보았지만, 그 일은 일어나지 않았다. 나는 아직도 더 관련된 정보를 찾고있다. 내일 NServiceBus.Host.exe를 실행 해 보겠습니다. 코드베이스의 여러 끝점에서도 발생하지만 내 컴퓨터에서만 발생합니다. – SpykeBytes

+0

NuGet 패키지로 엔드 포인트와 facades를 분리하고 모 놀리 식 솔루션을 사용하는 대신 이들을 소비하는 것을 노리고 있습니다. 이것은 이것과 관련이있을 수 있습니다. – SpykeBytes

답변

0

그래, 문제를 발견했습니다. 이것은 하나의 두려움이었다. 요컨대, 구성 교체는 붉은 청어였습니다.

내 끝점을 별도의 솔루션으로 분리하고 NuGet 패키지를 만드는 과정에서 RestSharp의 버전 번호를 104.1.0에서 105.0.1로 증가 시켰습니다.

휴식 RestClient의 서명이 크게 변경되었습니다. BaseUrl은 문자열 대신 Uri가되었습니다.

이 끝점의 생성자에서 ConfigurationAccessService의 인스턴스를 만들어서 생성자에서 RestClient를 만들었습니다.

이제 NServiceBust.Host는 EndpointConfig TWICE의 인스턴스를 만듭니다. 먼저 시도해보고 메타 데이터를 얻으십시오. 둘째, 실제로 사용합니다. 구성은 두 번째 인스턴스까지 스왑 아웃되지 않습니다.

그래서 RestSharp가 업그레이드되면 appSettings가 없기 때문에 첫 번째 인스턴스가 실패했습니다. 예상되는 appSetting이 null이고 null 문자열로 Uri를 초기화 할 수 없으면 예외가 발생합니다. 서비스가 매번 시작될 수 없다는 것을 의미합니다.

1
System.AppDomain.CreateDomain를 호출하는 System.AppDomainSetup를 통해 사용됩니다

public string EndpointConfigurationFile 
{ 
    get { return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, type.Assembly.ManifestModule.Name + ".config"); } 
} 

: 그런 다음, 발견 된 종류에 아래의 코드를 호출하여 app.config 파일의 경로를 찾아

"실행중인"응용 프로그램의 구성 파일이 사용되며 DLL의 구성은 사용되지 않습니다.

서비스를 어떻게 호출합니까? NServiceBus.Host.exe 사용 하시겠습니까? 그런 다음 해당 exe의 구성 파일이 항상 사용됩니다. dll의 설정에서 모든 설정을 복사하여 작동 시키려면 exe의 설정 파일에 붙여 넣으십시오. exe의 config가 응용 프로그램 폴더에 없으면 만듭니다.

+0

NServiceBus.Host.exe.config 파일을 사용하는 것이 합리적입니다. EnrollmentService.Reporting.dll.config를 복사하고 이름을 NServiceBus.Host.exe.config로 변경하면 조직의 다른 모든 컴퓨터가 * .dll.config를 사용하여 작동합니다. 어떤 NServiceBus 마법인지는 모르겠지만 그럴 것이라고 생각합니다. 내 컴퓨터에서 변경된 것이이 문제를 일으켰습니다. – SpykeBytes

+0

해당 컴퓨터에서 EnrollmentService.Reporting.dll.config를 실행하고 있습니까? 그들은 어떻게이 DLL을 "실행"합니까? – Hash

+0

Visual Studio 2012에서 디버그 모드로 새 인스턴스를 시작하여 로컬로 서비스를 실행합니다. NServiceBus.Host.exe/install/sc /serviceName:"EnrollmentService.Reporting " I를 사용하여 서비스가 컴퓨터에 설치되어 있습니다. NSB는 OWIN 자체 호스트를 사용한다고 믿습니다 : http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api – SpykeBytes