0

I am using wsDualHttpBinding, server is self hosted. I am having a problem that looks to me that my ClientBaseAddress of my client is not accessible. I am at a loss of how to fix this problem.

Here is my service config:

<system.serviceModel>
<services>
  <service name="GuiEndpoint.GuiService">
    <endpoint address="" 
              binding="wsDualHttpBinding"
              bindingConfiguration="GuiEndpoint" 
              name="dualHttpBinding" 
              contract="Common.IGuiService">
      <!--<identity>
        <dns value="localhost"/>
      </identity>-->
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange"/>
    <host>
      <baseAddresses>
        <add baseAddress="http://192.168.1.199:8733/Design_Time_Addresses/GuiEndpoint/IGuiService/"/>
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="True"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<bindings>
  <wsDualHttpBinding>
    <binding name="GuiEndpoint">
      <security mode="None">
        <message clientCredentialType="None"/>
      </security>
    </binding>
  </wsDualHttpBinding>
</bindings>
<diagnostics>
  <messageLogging logEntireMessage="true"
                  maxMessagesToLog="300"
                  logMessagesAtServiceLevel="true"
                  logMalformedMessages="true"
                  logMessagesAtTransportLevel="true" />
</diagnostics>

On my client I am connecting programmaticly with this code:

WSDualHttpBinding binding = new WSDualHttpBinding();

binding.Security.Mode = WSDualHttpSecurityMode.None;
binding.Security.Message.ClientCredentialType = MessageCredentialType.None;
binding.ClientBaseAddress = new Uri("192.168.1.189:8080/TempUri");

EndpointAddress endpoint = new EndpointAddress(Helper.CreateUri(client.Connection.ServerAddress));

context = new InstanceContext(this);

serviceClient = new GuiServiceClient(context, binding, endpoint);
serviceClient.InnerDuplexChannel.Faulted += InnerChannelOnFaulted;

try
{
    if (serviceClient.Subscribe())
    {
        startKeepAliveTimer();
    }
}
catch (EndpointNotFoundException)
{
    this.Error("Couldn't Connect!");
}

Now, using Fidler I can see the messages going back and forth.

Server: enter image description here

Client: enter image description here

As you can see, the client can talk to the server, but the server can't seem to talk to the client.

I have also registered the namespace on the client:

enter image description here

The client port is accessible also:

Starting Nmap 6.25 ( http://nmap.org ) at 2013-01-03 14:05 Mountain Standard Time

Nmap scan report for 192.168.1.189

Host is up (0.10s latency).

PORT     STATE SERVICE

8080/tcp open  http-proxy

MAC Address: xx:0B:A9:57:xx:xx (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 13.42 seconds

Any kind of help here would be great!

jpiccolo
  • 768
  • 1
  • 6
  • 19

1 Answers1

1

What Microsoft have failed to put in any documentation is that:

The IP ADDRESS you specify in the ClientBaseAddress MUST BE resolvable to a HOST NAME. In other words, if the server can't ping the client by its HOST NAME, then you will never be able to establish a connection.

As you have discovered it just doesn't work!

Try replacing 192.168.1.189 with the host name of the client PC, like this:

 http://ClientHostName:8080/TempURI

Also as a hint, if you don't want to have to register any ports, just use the address

http://MyClientHostName/Temporary_Listen_Addresses/TempUri

because you are allowed to register any url starting with

http://+80/Temporary_Listen_Addresses/
stitty
  • 972
  • 9
  • 10