我想要实现的是支持签名标头的自定义绑定。
我通过以下步骤创建自定义绑定:
我创建了三个元素来设置自定义绑定: SecurityBindingElement,TextMessageEncodingElement,HttpsTransportBindingElement。
private BindingElement CreateSecurityBindingElement()
{
SecurityBindingElement security = SecurityBindingElement.CreateCertificateOverTransportBindingElement();
security.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10;
security.SecurityHeaderLayout = SecurityHeaderLayout.LaxTimestampLast;
security.DefaultAlgorithmSuite = SecurityAlgorithmSuite.Basic128Sha256Rsa15;
X509SecurityTokenParameters X509Parameters = new X509SecurityTokenParameters();
X509Parameters.InclusionMode = SecurityTokenInclusionMode.Once;
X509Parameters.RequireDerivedKeys = false;
X509Parameters.X509ReferenceStyle = X509KeyIdentifierClauseType.SubjectKeyIdentifier;
security.EndpointSupportingTokenParameters.Signed.Add(X509Parameters);
security.IncludeTimestamp = true;
security.EnableUnsecuredResponse = true;
return security;
}
private static BindingElement CreateTextMessageEncodingElement()
{
BindingElement encoding = new TextMessageEncodingBindingElement
{
MessageVersion = MessageVersion.Soap11WSAddressing10,
};
return encoding;
}
private BindingElement CreateTransportBindingElement()
{
BindingElement transport = new HttpsTransportBindingElement
{
RequireClientCertificate = true,
};
return transport;
}
然后我按如下方式创建自定义绑定:
private Binding CreateBinding()
{
BindingElement security = CreateSecurityBindingElement1();
BindingElement encoding = CreateTextMessageEncodingElement();
BindingElement transport = CreateTransportBindingElement();
return new CustomBinding(
encoding,
security,
transport
);
}
之后我创建了一个带有绑定
的ChannelFactorypublic TResponse Send<TResponse>(Guid messageId, Func<TChannel, TResponse> send)
{
OperationContext context = new OperationContext((IContextChannel)Channel);
using (OperationContextScope scope = new OperationContextScope(context))
{
var address = new EndpointAddress("http://www.w3.org/2005/08/addressing/anonymous?oin=00000001800866472000");
context.OutgoingMessageHeaders.ReplyTo = address;
context.OutgoingMessageHeaders.From = address;
context.OutgoingMessageHeaders.MessageId = new UniqueId(messageId);
return send(Channel);
}
}
当我尝试发送消息时,它以FaultException结束,消息'XPath expression // [local-name()='To'和namespace-uri()='http://www.w3.org/2005/08/addressing' ] | // [local-name()='From'和namespace-uri()='http://www.w3.org/2005/08/addressing'] | // [local-name()='Action'和namespace-uri()='http://www.w3.org/2005/08/addressing'] | // [local-name()='MessageID'和namespace-uri()='http://www.w3.org/2005/08/addressing'] | // * [local-name()='Body'和namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/']未被签名覆盖(来自客户)'
我无法弄清楚邮件未签名的原因。任何人都可以帮助我吗?