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