필자가 작성한 작은 WCF 호스팅 엔진을 사용하면 .config 파일을 기반으로 ServiceHosts를 동적으로 만들 수 있습니다. 일반적인 아이디어는 모든 서비스를 오프라인 상태로 만들 필요없이 런타임에 기존 서비스를 제거하고 새로운 서비스를 추가 할 수있게하는 것입니다.ServiceHost의 주소가 충돌 할 때 주소가 일치합니다.
나는 그것이 소리가 나는 것처럼 쉽지 않을 수 있음을 나타내는 문제 단위 테스트를 실시했습니다. 특정 엔드 포인트에 대해 하나의 ServiceHost 만 존재할 수있는 것처럼 보입니다 (단일 ServiceHost에 서비스에 대한 여러 개의 다른 엔드 포인트가있을 수 있음). 이는 정상적인 문제는 아니지만 서비스를 재구성해야 할 경우 원본 ServiceHost를 종료해도 해당 끝점 주소에 대한 등록이 실제로 중단되지는 않습니다. (같은 엔드 포인트가 사용됨을 의미) 같은 서비스, 다른 ServiceHost를 만들려고하면 다음과 같은 예외와 함께 실패합니다
System.InvalidOperationException: The ChannelDispatcher at 'net.pipe://localhost/' with contract(s) '"ITestService"' is unable to open its IChannelListener. --->
System.InvalidOperationException: A registration already exists for URI 'net.pipe://localhost/'.
는 사실은 단위 테스트 중에 오류가 발생하고있다. 이 테스트는 ServiceHosts와 호스팅 엔진을 최대한 인간적으로 가능한 한 많이 종료하는 하나의 유닛을 사용합니다. 그런 다음 다른 테스트를 위해 동일한 ServiceHost를 다시 만들려고하는 호스팅 엔진의 다른 인스턴스를 만듭니다. 두 번째 테스트는 위의 오류가 발생했습니다. 나는 ServiceHost.Close()가 호출 될 때 서비스 호스트를 실제로 파괴하지 않는다고 추측하고있다 ... 그래서 여전히 메모리에 매달리고있다. GC가 이전 서비스 호스트를 정리하고 있는지 여부를 알 수 없습니다. 문제는 처음에 발생한 후 사라지지 않고 계속 유지됩니다 (최선을 다해 결정할 수 있었던 것처럼 ... 지금까지 약 30 분을 기다렸습니다.)
다음과 같이는 system.serviceModel에 대한 나의 구성 파일은 다음과 같습니다
<system.serviceModel>
<services>
<service name="Campus.Core.ServiceModel.TestServiceStub">
<endpoint
address="net.pipe://localhost"
binding="netNamedPipeBinding"
contract="Campus.Core.ServiceModel.ITestService"
/>
</service>
</services>
</system.serviceModel>
동일한 문제가 발생합니다. 이후로 문제를 해결할 수 있었습니까? – Elan
1 년 전에이 문제가 발생했습니다. 더 이상 코드가 없지만 코드를 통해 프로그래밍 방식으로 서비스를 호스팅 할 수있는 방법을 발견하여 단위 테스트를 실행할 때 포트를 변경할 수있었습니다. 나는 당신을 어떤 식 으로든 돕기를 바랍니다. –