ServiceStack Soap 1.2 HTTPS клиент

у меня есть ServiceStack на основе Soap-клиента, который работает правильно для 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-нейтральным клиентом:

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

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

<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" /> to <transport clientCredentialType="transport" />


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

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