ServiceStack Soap 1.2 HTTPS-клиент

У меня есть ServiceStack на основе Soap Client, который работает правильно для HTTP, но когда я пытаюсь использовать HTTPS, это дает мне эту ошибку

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

Я использую самоподписанный сертификат, но могу успешно использовать curl для вызова службы Soap. Это для меня означает, что проблема на стороне клиента.

Мой код идет по линии

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

Выше показан пример использования класса DTO запроса / ответа.

Что мне нужно сделать, чтобы он работал с HTTPS без использования файлов конфигурации, только код?

3 ответа

Решение

Проблема с файлом конфигурации заключается в том, что он не всегда прост и иногда просто непрактичен. Помимо этого ServiceStack поддерживает модель кодирования без конфигурации.

Мне удалось добиться необходимой функциональности с помощью следующего SSL-нейтрального клиента:

открытый класс SoapServiceClient: Soap12ServiceClient
{
    public SoapServiceClient(string uri): base(uri)
    {
        if (uri.StartsWithIgnoreCase("https://"))
        {
            переменная привязка = (WSHttpBinding)base.Binding;
            binding.Security.Mode = SecurityMode.Transport;
        }
    }
}

Я считаю, что ваша проблема в вашем конфигурационном файле, попробуйте добавить в тег привязки. относительно этого ServiceStack.IntegrationTests вы должны иметь

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

но в этом тесте он настроен только на HTTP, а не HTTPS, поэтому все, что вам нужно сделать, это изменить <transport clientCredentialType="None" /> в <transport clientCredentialType="transport" />

Вам нужно иметь 2 отдельных базовых адреса, один для HTTP и один для HTTPS.

Вы можете определить это в файле конфигурации или в своем коде, который выполняет хостинг.

Другие вопросы по тегам