2010-12-26 11 views
11

WCF newbie here ... NetTcpBinding을 사용하여 WCF 서비스를 자체 호스팅하려고합니다. 내가 수행 한 MSDN "how-to" tutorial을 바탕으로 모든 그때 지금 NetTcpBinding에 WsHttpBinding과 변경 및 코드에서 바인딩과 같습니다코드에서 NetTcpBinding을 할 수 있습니까? 너?

var baseAddress = new Uri("net.tcp://localhost:8000/MyWebService"); 
var selfHost = new ServiceHost(typeof(ConcreteWebService), baseAddress); 
try { 
    var binding = new NetTcpBinding(); 
    binding.Security.Mode = SecurityMode.Message; 
    selfHost.AddServiceEndpoint(typeof(IWebService), binding, "TRWebService"); 
    selfHost.Open(); 
    Console.WriteLine("The service is ready at {0}", baseAddress.AbsoluteUri); 
    Console.WriteLine("Press <ENTER> to terminate service."); 
    Console.WriteLine(); 
    Console.ReadLine(); 

    selfHost.Close(); 
} catch (CommunicationException ce) { 
    Console.WriteLine("An exception occurred: {0}", ce.Message); 
    selfHost.Abort(); 
} 

것이 튜토리얼은 다음에 svcutil.exe에 실행해야 말한다이다 클라이언트에 대한 프록시를 생성 ...하지만 NetTcpBinding을 전환 한 이래로 svcutil이 더 이상 작동하지 않습니다. 내 서비스를 감지 할 수 없습니다. 나는 그 문제를 봤고, NetTcpBinding의 모든 단일 예제가 코드가 아니라 app.config 파일에 설정을한다는 것을 알았고, 모두 "Mex"라는 끝점을 추가하고 "mexTcpBinding"바인딩 유형을 추가했습니다. 이 코드에 해당하는 코드는 없습니다.

그래서 app.config를 사용하도록 프로젝트를 변경하고 코드 기반 접근 방식을 포기해야합니까? 누구든지 Mex가 무엇인지, 왜 내가 왜 그것을 필요로하는지, 그리고 왜 (분명히) 코드에서 호출 할 수 없는지를 설명 할 수 있습니까? 아니면 가능한지, 어떻게 또는 왜 낙담합니까? 일반적으로 언제 app.config를 사용하고 WCF 서비스를위한 코드를 사용할 것인가?

+0

정확한 튜토리얼을 따르고 있고 콜백 계약을 원했기 때문에 tcp로 전환 한 후 똑같은 문제가있었습니다. – bryanbcook

답변

17

netTcpBinding을 사용하고 "사후 방화벽"LAN 환경에서 사용하는 경우 확실히 그렇게하는 것이 좋습니다. mexTcpBinding을 순서대로 사용하여 MEX 끝점 (Metadata Exchange)을 노출해야합니다. svcutil이 해당 서비스를 감지하고 찾을 수 있어야합니다.

MEX = 메타 데이터 교환은 WCF가 서비스가 어떻게 보이는지 공개적으로 알리는 데 사용하는 메커니즘입니다. MEX 엔드 포인트가있는 경우 svcutil과 같은 유틸리티는 서비스를 쿼리하고 "발견"할 수 있습니다. 노출하는 모든 서비스 메소드, 얻을 것으로 예상되는 매개 변수 등에 대해 알아보십시오.

MEX 끝점을 추가하려면 코드도 사용할 수 있습니다. 이 조각 같은 뭔가 : MEX없이

var mexBinding = MetadataExchangeBindings.CreateMexTcpBinding(); 
selfHost.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, "mex"); 

, 당신은 어떻게 든 클라이언트가 클라이언트가 적절한와 적절한 방법을 호출해야 할 수 있도록 서비스가 제공하는 어떤 서비스를 소비하려고 "에게"필요 매개 변수.

+0

+1 감사합니다. app.config와 코드의 설정은 어떻습니까? –

+0

@Shaul : app.config는 유연성을 제공합니다. 코드를 변경하거나 다시 컴파일하지 않고도 basicHttpBinding으로 변경할 수 있습니다. 그러나 코드 외에도 코드에서 수행하는 것이 좋습니다. 귀하의 필요에 맞는 것을 골라라! –

+0

고맙습니다. 훌륭한 답변입니다. – Prasanth

관련 문제