2011-08-24 9 views
0

를 참조하는 기본 끝점 요소를 찾을 수 없습니다 전체 오류 메시지 :계약 (작동하지 않는 간단한 WCF 서비스)

기본 끝점 요소를 찾을 수 없습니다 그 ServiceModel은 서비스 클라이언트 구성에서 참조 계약 'SampleProject.ITextMessage' 섹션. 응용 프로그램에 에 대한 구성 파일이 없거나이 계약과 일치하는 끝점 요소가 클라이언트 요소에서 발견되지 않았기 때문일 수 있습니다.

이것은 콘솔 앱입니다. 이것으로는 훨씬 더 간단해질 수 없습니다.

이 경우에는이 필요하지 않으므로 간단한 샘플을 얻으려고합니다. 나는 여기에서 코드를 꽤 많이 들었다 : http://msdn.microsoft.com/en-us/library/ms731758.aspx

어떤 도움을받을 수 있습니다.

public class SampleProject 
    { 
     static void Main(string[] args) 
     { 
      var baseAddr = new Uri("http://localhost:6000/TextMessageSvc.svc"); 

      using (var localHost = new ServiceHost(typeof(TextMessageClient), baseAddr)) 
      { 
       try 
       { 
        //THIS page says an endpoint is not needed, a default will be created automatically: 
        //http://msdn.microsoft.com/en-us/library/ms731758.aspx 
        localHost.AddServiceEndpoint(typeof(ITextMessage), 
               new WSHttpBinding(), 
               "TextMessageSvc"); 

        var behavior = new ServiceMetadataBehavior(); 
        behavior.HttpGetEnabled = true; 
        behavior.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; 

        localHost.Description.Behaviors.Add(behavior); 
        localHost.Open(); 

        Console.WriteLine("Service initialized."); 

        //************** Blows up on this line *********************** 
        var x = new TextMessageClient(); 
        x.SendTextMessage(); 

        Console.WriteLine("Press the ENTER key to terminate service."); 
        Console.ReadLine(); 

        localHost.Close(); 
       } 
       catch (CommunicationException ex) 
       { 
        Console.WriteLine("Oops! Exception: {0}", ex.Message); 
        localHost.Abort(); 
       } 
      } 
     } 
    } 

    public class TextMessageClient : ClientBase<ITextMessage>, ITextMessage 
    { 
     public void SendTextMessage() 
     { 
      base.Channel.SendTextMessage(); 
     } 
    } 

    [ServiceBehavior] 
    public class TextMessageSvc : ITextMessage 
    { 
     public TextMessageSvc() 
     { 

     } 

     [OperationBehavior] 
     public void SendTextMessage() 
     { 

     } 
    } 

    [ServiceContract] 
    public interface ITextMessage 
    { 
     [OperationContract] 
     void SendTextMessage(); 
    } 

답변

1

그래서이 예제의 문제는 (웹 구성을 사용하고 있지 않으므로) 끝점 인이 아님이 밝혀졌습니다. (localhost는 하나만 가지고 있지만 이 아님 TextMessageClient) SendTextMessage를 호출하면 어떻게 통신 할 수 있습니까? 누구와 이야기 할 예정입니까 ??

글쎄, 엔드 포인트를 만들어서 TextMessageClient에 전달하거나, 지금 생성자에서 하나만 만들면된다.

그래서 TextMessageSvc에서 TextMessageProxy로 이름을 바꾸고 리팩터링 한 후.

을 지금 엔드 포인트를 설정 어딘가에 기능을 가지고 : 이 당신이 새로운 코드를 통지하는 경우에만 지금 서비스를 소비하기보다는뿐만 아니라 호스트 일을 시도 내가 지금 ( 필요하다 .

public class TextMessageProxy : ClientBase<IFredContract>, IFredContract 
    { 
     public TextMessageProxy(string url, WebHttpSecurityMode securityMode = WebHttpSecurityMode.None) 
      : base(ConstructEndpoint(url, securityMode)) 
     { 
     } 

     public string SendTextMessage(string sendToPhoneNumber, string messageText) 
     { 
      return base.Channel.SendTextMessage(sendToPhoneNumber, messageText); 
     } 

     // This method constructs a WebHttpBinding endpoint with all the appropriate 
     // settings for talking to our services. 
     private static ServiceEndpoint ConstructEndpoint(string serviceUri, WebHttpSecurityMode securityMode) 
     { 
      var contract = ContractDescription.GetContract(typeof(IFredContract)); 
      var binding = new WebHttpBinding(securityMode); 

      var address = new EndpointAddress(serviceUri); 
      var endpoint = new ServiceEndpoint(
       contract, 
       binding, 
       address); 

      //custom stuff. You may or may not need these settings, but I do.. 
      //I would think you need at least the behavior, as it is likely required, as it is in the web.config. 
      //------------- 
      var webHttpBehavior = new WebHttpBehavior() 
      { 
       FaultExceptionEnabled = true 
      }; 

      endpoint.Behaviors.Add(webHttpBehavior); 
      //------------- 

      return endpoint; 
     } 
    } 
: TextMessageClient 사용하는

var uri = _appSettings.Get("FredServiceURI"); //"http://localhost:3333/FredService.svc/" 
var wcfSendTextMessage = new TextMessageProxy(uri); 

을 끝난 TextMessage 클래스는 이제 자신의 엔드 포인트를 제공합니다

0

기본 주소가 서비스 페이지 (TextMessageSvc.svc)를 지정하고 있으므로 기본 주소에 유효하지 않을 수 있습니다. 이 시도

`http://localhost:6000/TextMessageSvc/TestMessage.svc/extMesssageSvc")` 

: 엔드 포인트를 추가 할 때, 당신이 뭔가를 얻고있는 기본 엔드 포인트 (당신이 그들을 사용하는 것 같은) 것을 알고, 또한

var baseAddr = new Uri("http://localhost:6000/TextMessageSvc"); 

를됩니다 WCF 4.0 (.NET 4.0/VS 2010)의 기능이며 이전 버전에서는 사용할 수 없었습니다.

관련 문제