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.
Вы можете определить это в файле конфигурации или в своем коде, который выполняет хостинг.