Paul Rooney
Paul Rooney

Reputation: 21609

ServiceStack Soap 1.2 HTTPS Client

I have a ServiceStack based Soap Client, which operates correctly for HTTP but when I try to use HTTPS it gives me this 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()

I am using a self signed certificate, but I am able to use curl to call my Soap service successfully. This to me indicates that the issue is at the client end.

My code goes along the lines of

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

The above shows example request/response DTO class usage.

What do I have to do to make it work with HTTPS without using config files, only code?

Upvotes: 9

Views: 1429

Answers (3)

user3032112
user3032112

Reputation: 141

The problem with config file is that it isn't always straightforward and sometimes plain unpractical. On top of this ServiceStack promotes config-less coding model.

I managed to achieve the required functionality with the following SSL-neutral client:

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

Upvotes: 2

silver
silver

Reputation: 1703

you need to have 2 separate base addresses, one for the HTTP and one for HTTPS.

you can define it in configuration file or in you code that performs the hosting.

Upvotes: 3

Hussein Khalil
Hussein Khalil

Reputation: 1401

I believe your problem is in your config file, try to add to the binding tag. regarding to this ServiceStack.IntegrationTests you should have

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

but in this test, it is only configured to work on HTTP not HTTPS so all you have to do is to change <transport clientCredentialType="None" /> to <transport clientCredentialType="transport" />

Upvotes: 6

Related Questions