我有一个简单的WCF客户端 - >服务器结构,在客户端引用服务器的WCF服务。 身份验证使用X509证书来完成。
我想冗余的简单形式添加到我的服务。 含义 - 有几台服务器上运行,并让客户端使用路由器将透明地故障切换到备份服务器,如果主要的一个是死的。
我已经看了WCF 4.0路由,但是这是没有好 。
那么剩下的就是做我自己。 我发现一个很好的例子是做到了这一点。
然而,笔者没有使用任何安全性可言。
我试图通过添加以下到路由器的添加消息级安全<client>
绑定配置(从我现有的客户端的配置复制它):
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
<message clientCredentialType="Certificate" negotiateServiceCredential="false"
algorithmSuite="Default" establishSecurityContext="false" />
</security>
用这个,我得到一个
未提供客户端证书。 指定ClientCredentials客户端证书。
从我的服务器异常。
所以我手动添加的证书到我在路由器的代码(这里完整的清单)创建的渠道:
[ServiceContract(Name = "IntermediateServiceManager")]
public interface IIntermediateServiceContract
{
[OperationContract(Name = "ProcessMessage", Action = "*", ReplyAction = "*")]
Message ProcessMessage(Message message);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, AddressFilterMode = AddressFilterMode.Any)]
public class IntermediateServiceManager : IIntermediateServiceContract
{
public Message ProcessMessage(Message requestMessage)
{
ChannelFactory<IIntermediateServiceContract> factory = new ChannelFactory<IIntermediateServiceContract>("MyEndpoint");
factory.Credentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine,StoreName.My,X509FindType.FindBySubjectName,"mycert.company.com");
IIntermediateServiceContract proxy = factory.CreateChannel();
IClientChannel clientChannel = proxy as IClientChannel;
Message responseMessage = proxy.ProcessMessage(requestMessage);
return responseMessage;
}
}
现在我得到的错误是
多个头名为“安全”和命名空间“ http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd ”和角色'found`。
我打开WCF的诊断,并与从路由器发送与从客户端发送邮件的标题。 而事实上,路由器的消息有2个安全标头。
我假设最初是由客户端增加了一个(因为它不知道它现在的工作对一个路由器 - 它仍然认为这是实际的服务器),以及由路由器的第二个。
因此,从逻辑上讲,接下来要做的事情就是禁用我在第一次到路由器配置(简单地改变添加的安全security mode
,以None
)。
而现在我得到的例外是
在“收件人”,“ http://www.w3.org/2005/08/addressing ”所需的消息部分没有签名
我假设这意味着我的路由器已经改变了信息的To
现场,由于没有安全是configured-路由器没有签名...
所以我想我有点卡住。 目前,我正在考虑这两个选项是:
- 与消息的头不知怎的,篡改和删除冗余的安全头。
- 禁用客户端与路由器之间的安全性,只有路由器和服务之间具有安全性。
然而,这具有更改客户端,这是我不想做的缺点。
有任何想法吗?