2015-05-16 18 views
9

Ho un cliente Sapone ServiceStack base, che opera correttamente per HTTP, ma quando provo a utilizzare HTTPS mi dà questo erroreServiceStack Sapone 1.2 HTTPS client

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() 

Sto usando un certificato auto firmato, ma io Sono in grado di usare curl per chiamare con successo il mio servizio Soap. Questo per me indica che il problema è alla fine del cliente.

Il mio codice va lungo le linee di

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

Quanto sopra mostra esempio di richiesta/risposta utilizzo di classe DTO.

Cosa devo fare per farlo funzionare con HTTPS senza utilizzare i file di configurazione, solo il codice?

+0

si prega di aggiungere il codice/configurazione del servizio di hosting. – silver

+0

@silver Non c'è alcuna configurazione. Ho aggiunto un po 'più di codice, che mostra almeno la chiamata 'send' che attiva l'eccezione. Il servizio di sapone in sé non è un servizio basato su ServiceStack (solo client), ma a prescindere dal codice non arriva a colpire effettivamente il server dall'altra parte. –

risposta

2

Il problema con il file di configurazione è che non è sempre semplice e talvolta semplice non pratico. Oltre a questo ServiceStack promuove il modello di codifica senza configurazione.

sono riuscito a ottenere la funzionalità richiesta con il seguente client SSL-neutro:

 
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

Credo che il tuo problema sia nel tuo file di configurazione, prova ad aggiungere al tag di associazione. riguardo a questo ServiceStack.IntegrationTests si dovrebbe avere

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

ma in questo test, si è configurato solo per lavorare su HTTP non HTTPS in modo tutto quello che dovete fare è di cambiare <transport clientCredentialType="None" />-<transport clientCredentialType="transport" />

+0

In realtà non ho un file di configurazione. Quindi creare è probabilmente la strada da percorrere. Ci proverò grazie. –

+0

puoi usare il link indicato nella mia risposta, ti aiuterà a compilare tutte le configurazioni necessarie, anche questo link potrebbe aiutare https://github.com/ServiceStack/ServiceStack/wiki/Config-API –

3

è necessario disporre di 2 indirizzi di base separati, uno per l'HTTP e uno per HTTPS.

è possibile definirlo nel file di configurazione o nel codice utente che esegue l'hosting.

+0

Come farei nel codice? Preferirei evitare la configurazione se posso. È solo un'applicazione di test niente di grave. –

+0

quando si crea l'host del servizio è necessario fornire una serie di Uris quindi fornire entrambi i protocolli (nuovo ServiceHost (MyService, nuovo [] {"http: // myService /", "https: // myService /"}))) – silver

Problemi correlati