2010-04-05 2 views
8

WCF-over-TCP 서비스 작동을 원합니다. 내 자신의 프로젝트를 수정하는 데 몇 가지 문제가 있었으므로 VS2008에 포함 된 "기본"WCF 템플릿부터 시작할 것이라고 생각했습니다. 여기 mexTcpBinding in WCF - IMetadataExchange 오류

는 초기 WCF의 App.config 내가 서비스를 실행할 때 WCF 테스트 클라이언트는 잘 작업 할 수이 전혀 완벽하게 아무 문제가 작동하지 않습니다

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.web> 
     <compilation debug="true" /> 
    </system.web> 
    <system.serviceModel> 
     <services> 
      <service name="WcfTcpTest.Service1" behaviorConfiguration="WcfTcpTest.Service1Behavior"> 
       <host> 
        <baseAddresses> 
         <add baseAddress="http://localhost:8731/Design_Time_Addresses/WcfTcpTest/Service1/" /> 
        </baseAddresses> 
       </host> 
       <endpoint address="" binding="wsHttpBinding" contract="WcfTcpTest.IService1"> 
        <identity> 
         <dns value="localhost"/> 
        </identity> 
       </endpoint> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="WcfTcpTest.Service1Behavior"> 
        <serviceMetadata httpGetEnabled="True"/> 
        <serviceDebug includeExceptionDetailInFaults="True" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 
</configuration> 

.

나는 사소한 것 TCP로 HTTP에서 변경 한 체격

: 자신의 TCP 등가물에 바인딩을 변경하고 httpGetEnabled serviceMetadata 요소 제거 :

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.web> 
     <compilation debug="true" /> 
    </system.web> 
    <system.serviceModel> 
     <services> 
      <service name="WcfTcpTest.Service1" behaviorConfiguration="WcfTcpTest.Service1Behavior"> 
       <host> 
        <baseAddresses> 
         <add baseAddress="net.tcp://localhost:1337/Service1/" /> 
        </baseAddresses> 
       </host> 
       <endpoint address="" binding="netTcpBinding" contract="WcfTcpTest.IService1"> 
        <identity> 
         <dns value="localhost"/> 
        </identity> 
       </endpoint> 
       <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="WcfTcpTest.Service1Behavior"> 
        <serviceDebug includeExceptionDetailInFaults="True" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 
</configuration> 

을하지만이 프로그램을 실행할 때 나는 WCF 서비스에서이 오류가 호스트 :

System.InvalidOperationException : 계약 이름 'IMetadataExchange'을 (를) Service1 서비스에서 구현 한 계약서 목록에서 찾을 수 없습니다. 이 계약에 대한 지원을 사용하려면 ServiceMetadataBehavior를 구성 파일이나 ServiceHost에 직접 추가하십시오.

TCP를 사용하여 메타 데이터를 보낼 수 없다는 느낌이 들지만 mexTcpBinding 옵션이있는 이유는 무엇입니까?

답변

20

글쎄, 메타 데이터 (TCP 또는 HTTP)를 갖고 싶다면 serviceMetadata 동작을 포함시켜야합니다!

<behaviors> 
    <serviceBehaviors> 
     <behavior name="WcfTcpTest.Service1Behavior"> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 
      <serviceMetadata /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 

물론, 당신은 "HttpGetEnabled"그것을 가질 수 없습니다 -하지만 행동 자체는 메타 데이터 (따라서 IMetadataExchange 계약)의 교환을 가능하게하기 위해 존재해야합니다.

+0

고마워요! 그랬어. WCF의 구성이 바로 설계된 것 같지 않습니다. App.config는 구성 파일입니다. 구성 요소를 제거했을 때 "이 기능을 사용하지 않도록 설정하지 않았습니다."가 아니라 "구성을 명시 적으로 설정하지 않았습니다."라는 의미입니다. 더 나은 방법은 다음과 같습니다. Dai

+1

@David : 오히려 오랫동안 논할 수있는 옵션입니다. WCF는 "거기에 없으면 활동적이지 않다"라는 접근 방식을 사용합니다. 일단 당신이 그것을 안다면, 괜찮습니다. 그리고 많은 의미를 갖습니다 (당신은 그것을 그 안에 넣고 활성화시키지 않기 위해 false로 설정하십시오 - 그것을 그냥 두십시오) –