2012-01-10 12 views
0

this exampleに基づいて、WCFコールバックサービスの自己ホスティングを実行しようとしています。コールバックWCFサービスの作成時にEndpointNotFoundExceptionが発生する

ここでホスティングコードです:

サービス:

static void Main(string[] args) 
    { 
     using (ServiceHost host = new ServiceHost(typeof(Message), new Uri("http://localhost:8000/HelloWCF"))) 
     { 
      // Set up a service endpoint [Contract, Binding, Address] 
      host.AddServiceEndpoint(typeof(IMessage), new WSDualHttpBinding() { ClientBaseAddress = new Uri("http://locahost:8001/HelloWCF") }, "HelloWCF"); 

      // Enable metadata exchange 
      ServiceMetadataBehavior smb = new ServiceMetadataBehavior() {HttpGetEnabled =true }; 

      host.Description.Behaviors.Add(smb); 
      host.Open(); 

      Console.WriteLine("Ready..."); 
      Console.ReadLine(); 
     } 
    } 

クライアント:

app.configを

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <wsDualHttpBinding > 
       <binding name="WSDualHttpBinding_IMessage" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" clientBaseAddress="http://locahost:8001/HelloWCF"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" /> 
        <security mode="Message"> 
         <message clientCredentialType="Windows" negotiateServiceCredential="true" 
          algorithmSuite="Default" /> 
        </security> 
       </binding> 
      </wsDualHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://localhost:8000/HelloWCF/HelloWCF" binding="wsDualHttpBinding" 
       bindingConfiguration="WSDualHttpBinding_IMessage" contract="CallbackService.IMessage" 
       name="WSDualHttpBinding_IMessage" > 
       <identity> 
        <userPrincipalName value="badasscomputing\menkaur" /> 
       </identity> 
      </endpoint> 
     </client> 
    </system.serviceModel> 
</configuration> 

C#コード:

[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)] 
    class Sender : IMessageCallback, IDisposable 
    { 
     private MessageClient messageClient; 

     public void Go() 
     { 
      InstanceContext context = new InstanceContext(this); 
      messageClient = new MessageClient(context, "WSDualHttpBinding_IMessage"); 

      for (int i = 0; i < 5; i++) 
      { 
       string message = string.Format("message #{0}", i); 
       Console.WriteLine(">>> Sending " + message); 
       messageClient.AddMessage(message); 
      } 

     } 

     public void OnMessageAdded(string message, DateTime timestamp) 
     { 
     } 

     public void Dispose() 
     { 
      messageClient.Close(); 
     } 
    } 

    [CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)] 
    class Listener : IMessageCallback, IDisposable 
    { 
     private MessageClient messageClient; 

     public void Open() 
     { 
      InstanceContext context = new InstanceContext(this); 
      messageClient = new MessageClient(context, "WSDualHttpBinding_IMessage"); 

      messageClient.Subscribe(); 
     } 

     public void OnMessageAdded(string message, DateTime timestamp) 
     { 
      Console.WriteLine("<<< Recieved {0} with a timestamp of {1}", message, timestamp); 
     } 

     public void Dispose() 
     { 
      messageClient.Unsubscribe(); 
      messageClient.Close(); 
     } 
    } 

    static void Main(string[] args) 
    { 
     Listener l = new Listener(); 
     l.Open(); 

     Sender s = new Sender(); 
     s.Go(); 
    } 

サーバーが正常に起動します。クライアントを実行するとき 、それは以下の例外を除いて、サーバ機能のいずれかを呼び出すしようとするとクラッシュする:

EndpointNotFoundException:There was no endpoint listening at http://localhost:8000/HelloWCF/HelloWCF that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details. 

内部例外がある:リモートサーバーに接続することができません。

私は正常にこのの原因である可能性がありますどのようなコールバック関数

せずに同様のアプリをテストしたように、これは、理由はファイアウォールではないでしょうか?

UPDATED

完全なソースは、ここからダウンロードすることができます:http://iathao.com/tmp/fullSource.zip

+2

* badasscomputing *私は、HTTPクライアント側のエンドポイントを設定した場合 –

答えて

1

これらの小さな変更で、コードは自分のマシンで正常に動作します。

クライアントの設定

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <wsDualHttpBinding> 
       <binding name="WSDualHttpBinding_IMessage" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" /> 
        <security mode="Message"> 
         <message clientCredentialType="Windows" negotiateServiceCredential="true" 
          algorithmSuite="Default" /> 
        </security> 
       </binding> 
      </wsDualHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://localhost:8000/HelloWCF" binding="wsDualHttpBinding" 
       bindingConfiguration="WSDualHttpBinding_IMessage" contract="CallbackService.IMessage" 
       name="WSDualHttpBinding_IMessage"> 
       <identity> 
        <dns value="localhost" /> 
       </identity> 
      </endpoint> 
     </client> 
    </system.serviceModel> 
</configuration> 

スターターコード

また、私はあなたのマシン/ドメイン名を好き
namespace wcfStarter 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (ServiceHost host = new ServiceHost(typeof(Message), new Uri("http://localhost:8002/HelloWCF"))) 
      { 
       // Set up a service endpoint [Contract, Binding, Address] 
       host.AddServiceEndpoint(typeof(IMessage), new WSDualHttpBinding() { ClientBaseAddress = new Uri("http://locahost:8001") }, "HelloWCF"); 

       // Enable metadata exchange 
       ServiceMetadataBehavior smb = new ServiceMetadataBehavior() {HttpGetEnabled =true }; 

       host.Description.Behaviors.Add(smb); 
       host.Open(); 

       Console.WriteLine("Ready..."); 
       Console.ReadLine(); 
      } 
     } 
    } 
} 
+0

を参照してください。TCPポート80が別のアプリケーションによって使用されているため、「http:// +:80/Temporary_Listen_Addresses/9b0d36c7-c04e-4204-9a7c-eb887b03f3c9/" –

+0

ClientBaseAddressを別のポートに変更するだけならOKです。 – Jontatas

+1

ちょうど自分自身に気づいた。 clientBaseAddress = "http:// localhost:8001"をconfiguration/system.serviceModel/bindings/wsDualHttpBinding/bindingに追加すると完了しました。私の間違いは、clientBaseAddress = "http:// locahost:8001/HelloWCF"という設定です –

2

(注:余分な "/ HelloWCF")あなたはhttp://localhost:8000/HelloWCFであなたのエンドポイントをホストしているように見えるが、あなたのクライアントの設定はhttp://localhost:8000/HelloWCF/HelloWCFを指している

UPDATE

お使いのクライアントの設定契約CallbackService.IMessageに設定されていますが、コードにはIMessage契約のサービス実装はありません。

+0

:// localhostを:8000/HelloWCF、内部例外は404に変更され、サーバーは実行中 –

+0

私の更新を参照してください –

+0

IMessageはサーバー側のインターフェイスです。クライアントで実装されているIMessageCallbackにコールバックメッセージを送信する予定です –

関連する問題