2013-02-17 3 views
1

Я работаю над проектом, который использует службу WCF. Я создал службу, настроил файл web.config, развернул ее на сервере IIS 7. Услуга доступна через HTTPS (на моей машине dev, я сам создал сертификат). Все отлично, когда создается ServiceReference в Visual Studio 2010, он создает клиента, и он отлично работает.подключиться программно к службе WCF через HTTPS

Что мне нужно, чтобы создать клиента программно (нужно немного гибкости), так что, когда я пытаюсь соединить «вручную», он дает мне ошибку вроде этого:

The provided URI scheme 'https' is invalid; expected 'http'. Parameter name: via

Код для веб-сайтов. конфигурации является: (я надеюсь, что нет ничего плохого в нем)

<system.serviceModel>  
    <services>   
     <service name="WcfService1.Service1" behaviorConfiguration="WcfService1.Service1Behavior"> 
     <endpoint address="" binding="wsHttpBinding" bindingConfiguration="TransportSecurity" contract="WcfService1.IService1" /> 
     <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/> 
     </service> 

    </services> 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WcfService1.Service1Behavior"> 
      <serviceMetadata httpsGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="True"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 


    <bindings> 
     <wsHttpBinding> 
     <binding name="TransportSecurity"> 
      <security mode="Transport"> 
      <transport clientCredentialType="None"/> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 

    </system.serviceModel> 

процедуру я написал для доступа к службе WCF является:

void proc() 
{ 
     string ADRESASSL = "https://localhost/ServiciuSSLwsBind/Service1.svc"; 
     WSHttpBinding bind= new WSHttpBinding(); 

     EndpointAddress ea = new EndpointAddress(ADRESASSL); 
     var myChannelFactory = new ChannelFactory<IService1>(bind, ea); 

     IService1 client = null; 
     try 
     { 
      client = myChannelFactory.CreateChannel(); 
      client.RunMethod1(); 
      client.Close();     
      //((ICommunicationObject)client).Close(); 
     } 
     catch (Exception exc) 
     { 
      MessageBox.Show(exc.Message); 
      if (client != null) 
       client.Close(); 
     } 
    } 

Код для IService1

[ServiceContract] 
public interface IService1 : IClientChannel 
{ 
    [OperationContract] 
    int RunMethod1(); 

//.................................... 
} 

Кажется, я делаю что-то здесь не так, процедура вызывает исключение я упомянул. Что-то еще я должен сделать, чтобы работать, но я не понял этого.

Заранее благодарим за любые советы, которые вы можете мне дать.

+0

Как вы проводите обслуживание? Включен ли https на этом транспорте? – stephenl

ответ

3

Я не проверял это, но считаю, что вам нужно установить режим безопасности для привязки перед созданием фабрики. Режим по умолчанию для обеспечения безопасности для WSHttpBinding - SecurityMode.Message, и вы хотите SecurityMode.Transport.

Вы можете решить эту проблему тремя способами, как описано ниже.

Во-первых, вы можете использовать перегруженный версию WSHttpBinding конструктора для задания режима безопасности, например:

WSHttpBinding bind= new WSHttpBinding(SecurityMode.Transport); 
bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; 

Во-вторых, вы можете использовать конструктор без параметров и задать режим безопасности (и клиент верительных типа), как это:

WSHttpBinding bind= new WSHttpBinding(); 
bind.Security.Mode = SecurityMode.Transport; 
bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; 

в-третьих, вы можете разместить раздел binding конфигурации в клиенте конфигурации и ссылки, что раздел в конструкторе, например:

WSHttpBinding bind = new WSHttpBinding("TransportSecurity"); 

В третьем примере предполагается раздел wsHttpBinding с именем «TransportSecurity» в конфигурационном файле клиента.

Для получения дополнительной информации, проверьте эти статьи MSDN:

How to: Set the Security Mode

WSHttpBinding Constructor

+0

Я переписал код и протестировал его. Спасибо за ваш ответ, я буду копаться в этом. –

+0

Спасибо, Тим, за ответ, но, к сожалению, он генерирует следующую ошибку: Не удалось установить доверительные отношения для защищенного канала SSL/TLS с полномочием «localhost». Я предполагаю, что «localhost» - это локальный сертификат. –

+0

Я не много сделал с сертификатами, но проверьте [этот ответ] (http://stackoverflow.com/a/8854765/745969). – Tim

1

Ну, решил проблему с самостоятельным создан сертификатом. Я изменил адрес конечной точки как для программного соединения, так и для ссылки на службу в Viosual Studio 2010.

string ADRESASSL = "https://localhost/ServiciuSSLwsBind/Service1.svc"; 

теперь

string ADRESASSL = "https://eu-pc/ServiciuSSLwsBind/Service1.svc"; 

Я изменил адрес с локального хоста на имя ПК «ес-ПК». Это связано с доменом, выдавшим сертификат. Использование localhost или 127.0.0.1 работает только для одного метода или другого.

Надеюсь, это поможет другим парням, которые могут столкнуться с этим.

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