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