我有一个WCF服务通过https托管,并带有自签名证书。我在以编程方式创建绑定时遇到了麻烦:特别是端点行为的一部分。
我的服务配置如下所示:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="DisableServiceCertificateValidation">
<clientCredentials>
<serviceCertificate>
<authentication certificateValidationMode="None"
revocationMode="NoCheck" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<customBinding>
<binding name="ContactEmail.Web.EmailService.customBinding0">
<binaryMessageEncoding />
<httpsTransport/>
</binding>
</customBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<services>
<service name="ContactEmail.Web.EmailService">
<endpoint address="https://xxxxxxxxxxxxxx/EmailService/EmailService.svc" binding="customBinding" bindingConfiguration="ContactEmail.Web.EmailService.customBinding0" contract="ContactEmail.Web.EmailService" behaviorConfiguration="DisableServiceCertificateValidation" />
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
当我使用“添加服务引用”功能时,生成的客户端按预期工作。鉴于我打电话设置这样的证书验证回调:
System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);
但是,我不是通过客户端上的配置文件提供服务配置,而是需要以编程方式设置它,因为该调用将是共享库的一部分。所以,我试图通过向客户端构造函数提供我自己的参数来实现这一点,如:
var myClient = new EmailServiceClient(GetBinding(), new EndpointAddress(Strings.EmailServiceEndpointAddress));
在GetBinding()中,我使用BindingElements创建CustomBinding,如HttpsTransportBindingElement,BinaryMessageEncodingBindingElement和SecurityBindingElement.CreateSecureConversationBindingElement(SecurityBindingElement.CreateUserNameOverTransportBindingElement())。
你知道我如何指定诸如certificateValidationMode =“None”和revocationMode =“NoCheck”之类的东西,或者我是否做错了什么?
答案 0 :(得分:1)
您的ClientBase(EmailServiceClient)上应该有一个Credentials属性(类型为ClientCredentials)(http://msdn.microsoft.com/en-us/library/ms733836.aspx)...并且应该有一个ServiceCertificate属性: http://msdn.microsoft.com/en-us/library/system.servicemodel.description.clientcredentials.servicecertificate.aspx
答案 1 :(得分:1)
SecureConversation
是WS-SecureConversation =&gt;的实现高级消息级安全性,其中在第一次调用服务期间创建特殊安全性令牌(通过作为参数传递给创建绑定元素的消息安全性模式进行身份验证),此令牌用于保护后续消息。此安全性还可以形成安全上下文或安全会话。
您在配置文件中的当前绑定未使用SecureConversation
,因此代码中定义的绑定与您的服务不兼容。