2011-12-20 2 views
3

Мне нужно вызвать некоторые службы REST с сервера сторонних поставщиков через HTTPS. Я думал, что создаю себе небольшую библиотеку WCF для обработки этих вызовов и десериализации ответов. Но я все-таки отступил.Позвоните в службу HTTPS REST из WCF

Службы, которые я пытаюсь вызвать, имеют тестовую службу, которая просто отвечает ОК.

Я создал OperationContract в моем интерфейсе, как показано ниже:

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

В моем коде службы у меня есть открытый метод ниже:

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

Мой app.config выглядит следующим образом:

<?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> 

Я пытаюсь вызвать метод тестирования, но получаю сообщение об ошибке «Не удалось установить доверительное отношение nship для безопасного канала SSL/TLS с полномочиями '61 .61.34.19 '. "

Может ли кто-нибудь увидеть, что мне здесь не хватает?

Любая помощь приветствуется. Приветствия.

+0

Вы можете перейти к службе REST из своего IE и посмотреть ответ? Является ли проверка подлинности клиента службой REST с использованием сертификата клиента? – Rajesh

+0

Да, Rajesh, я могу просматривать IE и видеть ответ. –

+0

Если ваш сертификат подписан сам по себе, вы внедрили метод обратного вызова ServicePointManager, который проверяет сертификат сервера. Также просматриваете ли вы службу с клиентской машины, с которой вы пытаетесь протестировать? – Rajesh

ответ

1

Не удалось установить доверительные отношения для безопасного канала SSL/TLS с полномочиями '61 .61.34.19 '.

Это обычно означает, что существует проблема с сертификатом SSL сервера. Было ли это самозапись? Если это так, вы должны установить доверие к сертификату, как правило, trusting the issuing CA or installing the cert in the windows cert store.

+0

Cheers Randolph, сертификат установлен в магазине, и если я нажму URI для службы тестирования в IE я вижу результат, просто изо всех сил пытаюсь выполнить то же самое из WCF. Также попытался вызвать прямо из стандартного приложения WPF из болота путем опроса хранилища сертификатов, размещения сертификата и добавления в коллекцию HttpWebRequest.CientCertificates, а затем вызова .GetResponse() как HttpWebResponse –

0

Попробуйте изменить настройку безопасности webHttpBinding с «Транспорт» на «Нет».

Смежные вопросы