ServiceStack Soap 1.2 HTTPS 客户端
ServiceStack Soap 1.2 HTTPS Client
我有一个基于 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);
}
上面显示了示例 request/response DTO class 用法。
我需要做什么才能在不使用配置文件的情况下使用 HTTPS,仅使用代码?
我相信你的问题出在你的配置文件中,
尝试添加到绑定标签。
关于这个 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。
您可以在配置文件或执行托管的代码中定义它。
配置文件的问题在于它并不总是简单明了,有时甚至不切实际。在此 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;
}
}
}
我有一个基于 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);
}
上面显示了示例 request/response DTO class 用法。
我需要做什么才能在不使用配置文件的情况下使用 HTTPS,仅使用代码?
我相信你的问题出在你的配置文件中, 尝试添加到绑定标签。 关于这个 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。
您可以在配置文件或执行托管的代码中定义它。
配置文件的问题在于它并不总是简单明了,有时甚至不切实际。在此 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; } } }