[.net] 서비스에 애플리케이션 (비 인프라) 엔드 포인트가 없습니다.

최근에 WCF 서비스 (dll)와 서비스 호스트 (exe)를 만들었습니다. WcfTestClient에 서비스를 성공적으로 추가 할 수 있으므로 내 WCF 서비스가 올바르게 작동하고 있음을 알고 있습니다.

그러나 서비스 호스트 (exe)에서 내 WCF를 사용할 때 문제가 발생하는 것 같습니다. 내 서비스 호스트 (exe)에 WCF (dll)에 대한 참조를 추가하고 exe에 필요한 구성 요소를 만들 수 있습니다. 서비스 설치 프로그램, 서비스 호스트 및 app.config와 같은, 컴파일 한 다음 마지막으로 InstallUtil을 사용하여 exe를 설치합니다. 그러나 Microsoft Management Console에서 서비스를 시작하려고하면 서비스가 시작된 후 즉시 중지됩니다.

그래서 이벤트 뷰어의 응용 프로그램 로그에서이 오류가 발생한 원인이 정확히 무엇인지 조사하기 시작했습니다.

기술:

서비스를 시작할 수 없습니다. System.InvalidOperationException : 서비스 ‘서비스’에 응용 프로그램 (비 인프라) 끝 점이 없습니다. 이는 애플리케이션에 대한 구성 파일이 없거나 구성 파일에서 서비스 이름과 일치하는 서비스 요소를 찾을 수 없거나 서비스 요소에 정의 된 엔드 포인트가 없기 때문일 수 있습니다.

이 오류는 실제로 생성됩니다 OnStart. 이 호출을 수행 할 때 내 exe의 ServiceHost.Open(). 나는 다른 사람들이이 문제를 겪은 수많은 게시물을 보았지만, 전부는 아니더라도 대부분은 서비스 이름이나 계약을 주장합니다. 네임 스페이스 및 클래스 이름이 지정되지 않았습니다. 내 구성 파일에서이 두 항목을 모두 확인했습니다. exe뿐만 아니라 dll에서도 완벽하게 일치합니다. 나는 사무실에있는 다른 사람들에게 내가 한 번에 눈이 멀지 않았는지 다시 확인하도록했지만, 물론 그들은 모든 것이 올바르게 지정된 것처럼 보인다는 동일한 결론에 도달했습니다. 나는이 시점에서 무슨 일이 일어나고 있는지 정말로 잃어 버렸다. 누구든지이 문제로 나를 도울 수 있습니까?

이 문제가 발생할 수있는 또 다른 이유는 app.config가 읽히지 않는다는 것입니다. 적어도 내가 읽어야한다고 생각하는 것은 아닙니다. 이것이 문제일까요? 그렇다면이 문제를 어떻게 해결할 수 있습니까? 다시 한 번 모든 도움을 주시면 감사하겠습니다.



답변

방금이 문제가 발생하여 서비스 이름에 네임 스페이스를 추가하여 해결했습니다. 예 :

 <service name="TechResponse">

되었다

 <service name="SvcClient.TechResponse">

또한 App.config 대신 Web.config로 해결되는 것을 보았습니다.


답변

엔드 포인트에는 네임 스페이스도 있어야합니다.

 <endpoint address="uri" binding="wsHttpBinding" contract="Namespace.Interface" />


답변

고려해야 할 한 가지는 : WCF가 WindowsService (WS)에서 완전히 분리되어 있습니까? WS는 통제력이나 가시성이 많지 않기 때문에 고통 스럽습니다. 비 WS 항목을 모두 자체 클래스에 포함하여 호스트 WS와 독립적으로 테스트 할 수 있도록하여이를 완화하려고합니다. 이 접근 방식을 사용하면 특히 서비스와 비교하여 WS 런타임에서 발생하는 모든 일을 제거 할 수 있습니다.

John은 .config 파일 문제라는 것이 맞을 수 있습니다. WCF는 항상 실행 컨텍스트 .config를 찾습니다 . 따라서 다른 실행 컨텍스트에서 WCF를 호스팅하는 경우 (즉, 콘솔 응용 프로그램으로 테스트하고 WS로 배포) WCF 구성 데이터를 적절한 .config 파일로 이동했는지 확인해야합니다. 그러나 저에게 근본적인 문제는 WS goo가 방해가되기 때문에 문제가 무엇인지 모른다는 것입니다. 어떤 컨텍스트 (즉, 단위 테스트 또는 콘솔)에서든 서비스를 실행할 수 있도록 아직 리팩터링하지 않았다면 그렇게 할 것입니다. 단위 테스트에서 서비스를 가동하면, 엉뚱한 WS 배관으로 수행하려고 시도하는 것보다 디버그하기 훨씬 쉬운 WS에서 보는 것과 동일한 방식으로 실패 할 수 있습니다.


답변

서비스 프로젝트에서 콘솔 호스트 애플리케이션으로 App.config 파일을 복사하고 여기에 붙여 넣은 다음 서비스 프로젝트에서 삭제하면됩니다.


답변

프로그래밍 방식으로 추가했을 때 더 자세한 예외가 발생했습니다 AddServiceEndpoint.

string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));

host.AddServiceEndpoint(typeof(MyNamespace.IService),
                        new BasicHttpBinding(), baseAddress);
host.Open();


답변

WCF에 대한 구성을 준비하는 것은 어렵고 때로는 서비스 유형 정의가 눈에 띄지 않게됩니다.

서비스 태그에 네임 스페이스 만 작성 했으므로 동일한 오류가 발생했습니다.

<service name="ServiceNameSpace">

잊지 마십시오. 서비스 태그에는 완전한 서비스 클래스 이름이 필요합니다.

<service name="ServiceNameSpace.ServiceClass">

나와 같은 다른 사람들을 위해.


답변

오늘 나는 같은 문제에 직면하여 여기에 내 실수를 게시하고 누군가를 도울 수 있도록 수정했습니다.

코드를 재구성하는 동안 실제로 Service 클래스 및 IService 이름을 변경하고 ServiceHost를이 새 서비스 클래스 이름 (코드 조각에 표시됨)을 가리 키도록 변경했지만 호스트 응용 프로그램 App.Config 파일에서는 여전히 이전 서비스 클래스 이름을 사용하고있었습니다. . (아래 스 니펫의 구성 섹션 이름 필드 참조)

다음은 코드 스 니펫입니다.

 ServiceHost myServiceHost = new ServiceHost(typeof(NewServiceClassName)); 

섹션 서비스 아래의 App.config 파일에서 이전 서비스 클래스 이름을 참조하여 New ServiceClassName 수정 된 문제로 변경했습니다.

  <service name="ProjectName.OldServiceClassName">
        <endpoint address="" binding="basicHttpBinding" contract="ProjectName.IService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress=""/>
          </baseAddresses>
        </host>
      </service>