c# soap https servicestack soap1.2

c# - Cliente ServiceStack Soap 1.2 HTTPS



soap1.2 (3)

Tengo un Soap Client basado en ServiceStack , que funciona correctamente para HTTP pero cuando trato de usar HTTPS me da este error

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

Estoy usando un certificado autofirmado, pero puedo usar curl para llamar a mi servicio Soap con éxito. Esto para mí indica que el problema está en el extremo del cliente.

Mi código va a lo largo de las líneas de

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

Lo anterior muestra el uso de la clase DTO de solicitud / respuesta de ejemplo.

¿Qué debo hacer para que funcione con HTTPS sin usar archivos de configuración, solo código?


Creo que su problema está en su archivo de configuración, intente agregarlo a la etiqueta de enlace. con respecto a este ServiceStack.IntegrationTests debería tener

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

pero en esta prueba, solo está configurado para trabajar en HTTP, no HTTPS, así que todo lo que tiene que hacer es cambiar <transport clientCredentialType="None" /> a <transport clientCredentialType="transport" />


necesita tener 2 direcciones base separadas, una para HTTP y otra para HTTPS.

puede definirlo en el archivo de configuración o en el código que realiza el alojamiento.


El problema con el archivo de configuración es que no siempre es sencillo y, a veces, poco práctico. Además de esto ServiceStack promueve el modelo de codificación sin configuración.

Logré lograr la funcionalidad requerida con el siguiente cliente SSL neutral:

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