P_S_A_M
P_S_A_M

Reputation: 55

Call HTTPS REST service from WCF

I need to call some REST services from a third parties server over HTTPS. My thinking was that I would create myself a nice little WCF library to handle these calls and deserialise the responses. I'm coming a tad unstuck though.

The services I am trying to call have a test service that simply responds OK.

I have created an OperationContract in my interface as shown below:

[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare,
    ResponseFormat = WebMessageFormat.Xml,
    UriTemplate = "test")]
 string Test();

In my service code I have a public method below:

public string Test()
{
    ChannelFactory<IService1> factory = new ChannelFactory<IService1>("UMS");
    var proxy = factory.CreateChannel();
    var response = proxy.Test();
    ((IDisposable)proxy).Dispose();
    return (string)response;
}

My app.config looks like this:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <system.serviceModel>
    <client>
      <endpoint address="https://61.61.34.19/serv/ums/"
              binding="webHttpBinding"
              behaviorConfiguration="ums"
              contract="WCFTest.IService1"
              bindingConfiguration="webBinding"
              name="UMS" />
    </client>
    <services>
      <service name="WCFTest.Service1" behaviorConfiguration="WCFTest.Service1Behavior">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8731/Design_Time_Addresses/WCFTest/Service1/" />
          </baseAddresses>
        </host>
        <endpoint address ="" binding="wsHttpBinding" contract="WCFTest.IService1">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="ums">
          <clientCredentials>
            <clientCertificate findValue="restapi.ext-ags.801" 
                               storeLocation="CurrentUser" 
                               x509FindType="FindBySubjectName"/>
          </clientCredentials>
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="WCFTest.Service1Behavior">
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>       
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <webHttpBinding>
        <binding name="webBinding">
          <security mode="Transport">
            <transport clientCredentialType="Certificate" proxyCredentialType="None"/>
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

I try to invoke the test method but receive the error "Could not establish trust relationship for the SSL/TLS secure channel with authority '61.61.34.19'."

Can anyone see what I'm missing here?

Any help appreciated. Cheers.

Upvotes: 3

Views: 1673

Answers (2)

Justin
Justin

Reputation: 379

Try changing the webHttpBinding security setting from "Transport" to "None".

Upvotes: 0

Randolpho
Randolpho

Reputation: 56429

Could not establish trust relationship for the SSL/TLS secure channel with authority '61.61.34.19'.

This typically means there's a problem with the server's SSL cert. Was it self-signed? If so, you have to establish trust for the cert, typically by trusting the issuing CA or installing the cert in the windows cert store.

Upvotes: 1

Related Questions