2015-05-16 38 views
9

Ben HTTP için doğru çalışır ancak HTTPS kullanmaya çalıştığınızda bana bu hatayıServiceStack Sabun 1.2 HTTPS Müşteri

ServiceStack.WebServiceException: The provided URI scheme 'https' is invalid; ex 
pected 'http'. 
Parameter name: via ---> System.ArgumentException: The provided URI scheme 'http 
s' is invalid; expected 'http'. 
Parameter name: via 
    at System.ServiceModel.Channels.HttpChannelFactory`1.ValidateCreateChannelPar 
ameters(EndpointAddress remoteAddress, Uri via) 
    at System.ServiceModel.Channels.HttpChannelFactory`1.OnCreateChannelCore(Endp 
ointAddress remoteAddress, Uri via) 
    at System.ServiceModel.Channels.ChannelFactoryBase`1.InternalCreateChannel(En 
dpointAddress address, Uri via) 
    at System.ServiceModel.Channels.ServiceChannelFactory.ServiceChannelFactoryOv 
erRequest.CreateInnerChannelBinder(EndpointAddress to, Uri via) 
    at System.ServiceModel.Channels.ServiceChannelFactory.CreateServiceChannel(En 
dpointAddress address, Uri via) 
    at System.ServiceModel.Channels.ServiceChannelFactory.CreateChannel(Type chan 
nelType, EndpointAddress address, Uri via) 
    at System.ServiceModel.ChannelFactory`1.CreateChannel(EndpointAddress address 
, Uri via) 
    at System.ServiceModel.ClientBase`1.CreateChannel() 
    at System.ServiceModel.ClientBase`1.CreateChannelInternal() 
    at System.ServiceModel.ClientBase`1.get_Channel() 
    at ServiceStack.WcfServiceClient.Send(Message message) 
    at ServiceStack.WcfServiceClient.Send[T](Object request) 
    --- End of inner exception stack trace --- 
    at ServiceStack.WcfServiceClient.Send[T](Object request) 
    at ElectronicServiceInterface.ESIClient.Login() 
Ben kendinden imzalı sertifika kullanıyorum

verir ama bir ServiceStack tabanlı Sabun İstemci, ben Soap hizmetimi başarıyla çağırmak için curl kullanabiliyorum. Bu bana, sorunun istemci tarafında olduğunu gösteriyor.

My kod Yukarıdaki örnekte istek/yanıt DTO sınıfı kullanımını göstermektedir

using (var client = new Soap12ServiceClient(Uri)) 
{ 
    var request = new MyRequestObject { Username = Username, Password = Password }; 
    var response = client.Send<MyResponseObject>(request); 
} 

çizgisinde gider.

HTTPS ile yapılandırma dosyaları kullanmadan, yalnızca kod kullanmadan çalışmak için ne yapmam gerekiyor?

+0

hizmetleri hosting kod/yapılandırmayı ekleyin:

aşağıdaki SSL nötr müşteri ile gerekli işlevselliği elde başardı. – silver

+0

@silver Yapılandırma yok. En azından istisnayı tetikleyen 'gönder' çağrısını gösteren biraz daha fazla kod ekledim. Sabun servisinin kendisi ServiceStack tabanlı bir hizmet değildir (yalnızca istemci), ancak kodun aslında diğer uçta sunucuya ulaştığından emin olunmaz. –

cevap

2

Yapılandırma dosyasıyla ilgili sorun, her zaman basit ve bazen düz olmayan bir uygulama olmamasıdır. Bu ServiceStack'ın üstünde, yapılandırılmamış kodlama modelini destekler.

 
public class SoapServiceClient : Soap12ServiceClient 
{ 
    public SoapServiceClient(string uri) : base(uri) 
    { 
     if (uri.StartsWithIgnoreCase("https://")) 
     { 
      var binding = (WSHttpBinding)base.Binding; 
      binding.Security.Mode = SecurityMode.Transport; 
     } 
    } 
} 
5

Sorununuzun yapılandırma dosyanızda olduğuna inanıyorum, Bağlama etiketine eklemeye çalışın. Eğer

<bindings> 
      <basicHttpBinding> 
       <binding name="Endpoint_BasicHttpBinding" /> 
      </basicHttpBinding> 
      <wsHttpBinding> 
       <binding name="Endpoint_WsHttpBinding"> 
        <security mode="None"> 
         <transport clientCredentialType="None" /> 
         <message establishSecurityContext="false" /> 
        </security> 
       </binding> 
      </wsHttpBinding> 
     </bindings> 

olmalıdır ancak bu testte, sadece HTTPS yüzden yapmanız gereken tek şey olması gerekir <transport clientCredentialType="None" />

+0

Aslında bir yapılandırma dosyasına sahip değilim. Yani yaratmak muhtemelen gitmek için bir yoldur. Ben bunu deneyeceğim. –

+0

cevabımda bahsi geçen bağlantıyı kullanabilirsiniz, gerekli tüm konfigürasyonları doldurmanıza yardımcı olacaktır, ayrıca bu bağlantı https://github.com/ServiceStack/ServiceStack/wiki/Config-API –

3

<transport clientCredentialType="transport" /> değiştirmek için değil HTTP üzerinde çalışmak üzere yapılandırılmış bu ServiceStack.IntegrationTests için ilgili Biri HTTP ve bir HTTPS için olmak üzere 2 ayrı temel adres.

bunu yapılandırma dosyasında veya barındırma işlemini gerçekleştiren kodda tanımlayabilirsiniz.

+0

nasıl yardımcı olur? kodda mı? Yapabilirsem konfigürasyondan uzak durmayı tercih ederim. Sadece test uygulaması ciddi değil. –

+0

Servis sağlayıcınızı oluştururken bir Uris dizisi sağlamanız gerekir, böylece her iki protokol (yeni ServiceHost (MyService, yeni [] {"http: // myService /", "https: // myService /"}) – silver