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


91

최근에 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가 읽히지 않는다는 것입니다. 적어도 내가 읽어야한다고 생각하는 것은 아닙니다. 이것이 문제일까요? 그렇다면이 문제를 어떻게 해결할 수 있습니까? 다시 한 번 모든 도움을 주시면 감사하겠습니다.


2
서비스 계약의 정의는 service.dll.config에서 service.exe.config로 복사해야합니다.
John Saunders

1
서비스의 app.config를 보여줄 수 있습니까 ?? ServiceHost를 인스턴스화 / 열기 위해 NT 서비스에서 특별한 작업을 수행합니까?
marc_s

답변:


93

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

 <service name="TechResponse">

되었다

 <service name="SvcClient.TechResponse">

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


예, 네임 스페이스를 변경하여 .svc 파일의 서비스와 일치하는 서비스를 찾을 수 없습니다 (밑줄이 점으로 바뀜!) 서비스 이름을 빠르게 확인하여 무슨 일이 일어 났는지 알 수있었습니다.

1
내 문제도 해결했습니다.이 빠르고 쉬운 수정을 좋아하십시오!
vfilby

web.config를 추가하면이 오류를 해결하는 데 도움이되었습니다.
Ryan Rodemoyer 2014

2
이것은 내 문제를 해결했습니다! 감사합니다! 저와 같은 모든 초보자를 위해 :이 정말 명확한 튜토리얼을 제안하십시오 : lourenco.co.za/blog/2013/08/…
Homer1982

12

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

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

나는 이것이 app.config에 있지만 app.config에서 제거하지 않고 코드에서 변경하고 싶습니다. 새 끝점 주소와 함께 새 ServiceHost를 사용하면 오류가 발생합니다.
Paul McCarthy

9

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

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


1
빨리 응답 해 주셔서 감사합니다. 내 WCF (dll)에서 내 app.config를 복사했기 때문에 이것이 문제라고 생각하지 않습니다. 하지만 문제없이 WcfTestclient.exe를 사용하여 WCF (dll)를 가져올 수 있다는 것이 이상합니다. Windows 서비스 호스트 (exe)에서 실행하려고 할 때뿐만 아니라 구성 파일에 문제가 있다면 실패했을 것입니다. 내가 "비트"를 잃어버린 것처럼 들리면 사과드립니다. 저는 불행히도 WCF 및 서비스 기간에 여전히 초보자입니다. 다른 제안이 있습니까?
user280626 2010

9

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


5

프로그래밍 방식으로 추가했을 때 더 자세한 예외가 발생했습니다 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();

1
감사! 이 방법으로 주소를 전달하면 예외에 대한 자세한 내용이 표시됩니다. 내 경우에는이 포트가 : 다른 프로세스에 의해 사용되었다 단순히이었다
에르난 Veiras

서비스 참조 추가에서 검색을 클릭하면 기본 주소가 주소와 동일한 문제가 있습니다.
ZoomVirus

4

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

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

<service name="ServiceNameSpace">

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

<service name="ServiceNameSpace.ServiceClass">

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


1
내가 4 년 전에 여기에서 대답 한 것처럼?
SteveCav

똑같아 보이지만 한 가지 차이점이 있습니다. 잘못된 샘플은 클래스 이름 ( TechResponse) 만 작성하는 것이지만 내 이름 공간 ( ServiceNameSpace) 만 작성하고 있습니다 .
Uğur Aldanmaz 2016

4

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

코드를 재구성하는 동안 실제로 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>

여기도 마찬가지입니다. 클래스와 계약 이름의 대문자를 변경했고 모든 것이 작동했습니다. 감사.
Chazaq

3

나는 같은 문제가 있었다. 모든 것이 VS2010에서 작동하지만 VS2008에서 동일한 프로젝트를 실행하면 언급 된 예외가 발생합니다.

VS2008 프로젝트에서 내가 한 일은 AddServiceEndpointServiceHost 개체 의 구성원에 대한 호출을 추가하는 것입니다.

내 코드 스 니펫은 다음과 같습니다.

Uri baseAddress = new Uri("http://localhost:8195/v2/SystemCallbackListener");

ServiceHost host = new ServiceHost(typeof(SystemCallbackListenerImpl), baseAddress);

host.AddServiceEndpoint(typeof(CsfServiceReference.SystemCallbackListener),
                        new BasicHttpBinding(),
                        baseAddress);
host.Open();

app.config 파일을 수정하지 않았습니다. 하지만 서비스 엔드 포인트가 .config 파일에 추가되었을 수도 있습니다.


이 메서드를 사용하면 addServiceReferance 주소에이 주소를 사용할 수 있지만 AddressAccessDeniedException이 발생합니다.
ZoomVirus

2

내 서비스에서이 문제를 해결했습니다. 내가받은 오류는 다음과 같습니다.

서비스 'EmailSender.Wcf.EmailService'에는 애플리케이션 (비 인프라) 엔드 포인트가 없습니다. 이는 애플리케이션에 대한 구성 파일이 없거나 구성 파일에서 서비스 이름과 일치하는 서비스 요소를 찾을 수 없거나 서비스 요소에 정의 된 엔드 포인트가 없기 때문일 수 있습니다.

이 문제를 해결하는 데 사용한 두 단계는 다음과 같습니다.

  1. 올바른 정규화 된 클래스 이름을 사용하십시오.

    <service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
  2. mexHttpBinding으로 끝점을 활성화하고 가장 중요한 것은 IMetadataExchange 계약을 사용하는 것입니다.

    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>

2

이 오류는 WCF 서비스의 호스팅 응용 프로그램 구성 파일에 적절한 구성 이없는 경우 발생합니다.

구성에서이 주석을 기억하십시오.

서비스 라이브러리 프로젝트를 배포 할 때 구성 파일의 콘텐츠를 호스트의 app.config 파일에 추가해야합니다. System.Configuration은 라이브러리에 대한 구성 파일을 지원하지 않습니다.

IIS에서 호스팅되는 WCF 서비스가있는 경우 VS.NET을 통해 런타임 중에 서비스 라이브러리 프로젝트의 app.config를 읽지 만 배포 된 후에는 호스트의 web.config를 읽습니다. web.config에 동일한 <system.serviceModel>구성 이 없으면 이 오류가 발생합니다. 완료되면 app.config에서 구성을 복사해야합니다.


2

나는 방금이 문제를 만났고 위의 모든 답변을 확인하여 명백한 것이 누락되지 않았는지 확인했습니다. 글쎄, 나는 반 명백한 문제가 있었다. 코드에서 내 클래스 이름의 대 / 소문자와 구성 파일에서 사용한 클래스 이름이 일치하지 않습니다.

예 : 클래스 이름이 CalculatorService이고 구성 파일이 Calculatorservice를 참조하는 경우이 오류가 발생합니다.


같은 일을 경험했습니다. 특히 대규모 코드베이스를 리팩토링 할 때 찾기 어려울 수 있습니다. 물건을 이동할 때 WCF 구성에서 네임 스페이스를 업데이트해야합니다.
Arve Systad

2

관리자 모드에서 Visual Studio를 실행했고 저에게 효과적이었습니다. :) 또한 WCF 구성을 작성하는 데 사용하는 app.config 파일이 실제 WCF 서비스가 아닌 "ServiceHost"클래스가 사용되는 프로젝트에 있어야합니다. 계획.


이것은 저에게 많은 시간을 절약했습니다. :)
Parag

1

내 문제는 .svc 파일에 대한 기본 Service1 클래스의 이름을 더 의미있는 이름으로 변경했을 때 web.config behaviorConfiguration 및 끝 점이 이전 명명 규칙에 해당하게되었습니다. web.config를 수정하십시오.


1

WCF 서비스를 호스팅하기 위해 콘솔 응용 프로그램을 사용하는 사람들에게 기억해야 할 중요한 사항 중 하나 는 WCF 프로젝트 의 Web.config 파일이 완전히 무시 된다는 것 입니다. system.serviceModel구성이있는 경우 해당 구성 섹션을 콘솔 프로젝트 의 App.config 로 이동해야합니다 .

이것은 네임 스페이스가 올바른 위치에 지정되었는지 확인하는 것과 관련된 답변에 추가됩니다.


1

또 다른 단서로 제 경우에는이 문제가 실제로 해결되었습니다.

콘솔 애플리케이션 (코드가 거의없는 WCF 서비스로 구성됨)에서 일부 WCF 서비스를 Azure WebRole로 마이그레이션하여 Azure에 게시하고 있습니다. 새 서비스를 추가 할 때마다 VS는 내 web.config를 편집하고 다음 줄을 추가합니다.

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">

글쎄, 위의 모든 조언과 답변으로 serviceHostingEnvironment 요소의 모든 속성을 제거하기 전까지는 작동하지 못했습니다. 보시다시피 저는 WCF 록 스타는 아니지만 다음과 같이 구성하여 첫 번째 서비스와 함께 작동하도록 만들었습니다.

<service name="FirstService" behaviorConfiguration="metadataBehavior">
                <endpoint address=""
                 binding="wsHttpBinding"
                 bindingConfiguration="WSHttpBinding_WcfServicesBinding"
                 contract="IFirstService" />

            </service>

그러나 두 번째 서비스를 추가했을 때 작동이 중지되고 그 속성이 다시 거기에 있음을 깨달았습니다.

시간이 절약되기를 바랍니다.


0

내가 만든 WCF 서비스 라이브러리가 호스팅을 위해 연결되지 않았지만 연결을 위해 연결되었을 때 Windows 서비스에서이 오류가 발생했습니다. 끝 점이 없습니다. (내 Windows 서비스에서 연결과 호스팅을 모두 원했기 때문에 WCF 서비스를 다른 연결에 제공하고 Windows 서비스의 주요 프로세스에서 타이머 / 스케줄에 대한 다양한 작업을 수행 할 수 있도록했습니다.)

수정 사항은 App.config 파일을 마우스 오른쪽 단추로 선택하고 WCF 구성 편집을 선택하는 것입니다. 그런 다음 WCF 서비스에 연결할 수 있도록 서비스 만들기 단계를 수행했습니다. 이제 App.config에 하나가 아닌 두 개의 끝 점이 있습니다. 하나의 끝점은 WCF 서비스 라이브러리에 대한 연결 용이고 다른 하나는 호스팅 용이었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.