感谢有关此问题的 cmets/answers 和这些额外资源,我得到了它的工作:
我的解决方法如下:
AuthHeader
创建扩展 MessageHeader 的 AuthHeader 类以使用用户名和密码创建 AuthHeader:
public class AuthHeader : MessageHeader
{
private readonly string _username;
private readonly string _password;
public AuthHeader(string username, string password)
{
_username = username ?? throw new ArgumentNullException(nameof(username));
_password = password ?? throw new ArgumentNullException(nameof(password));
}
protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
{
writer.WriteStartElement("username");
writer.WriteString(_username);
writer.WriteEndElement();
writer.WriteStartElement("password");
writer.WriteString(_password);
writer.WriteEndElement();
}
public override string Name => "AuthHeader";
public override string Namespace => string.Empty;
}
HttpHeaderMessageInspector
创建一个 HttpHeaderMessageInspector,可用于将MessageHeader 添加到请求消息中。
public class HttpHeaderMessageInspector : IClientMessageInspector
{
private readonly MessageHeader[] _headers;
public HttpHeaderMessageInspector(params MessageHeader[] headers)
{
_headers = headers;
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
foreach (var header in _headers)
{
request.Headers.Add(header);
}
return null;
}
public void AfterReceiveReply(ref Message reply, object correlationState)
{
}
}
AddHttpHeaderMessageEndpointBehavior
创建一个使用 HttpHeaderMessageInspector 的特定 EndpointBehavior。
public class AddHttpHeaderMessageEndpointBehavior : IEndpointBehavior
{
private readonly IClientMessageInspector _httpHeaderMessageInspector;
public AddHttpHeaderMessageEndpointBehavior(params MessageHeader[] headers)
{
_httpHeaderMessageInspector = new HttpHeaderMessageInspector(headers);
}
public void Validate(ServiceEndpoint endpoint)
{
}
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.ClientMessageInspectors.Add(_httpHeaderMessageInspector);
}
}
客户
创建一个添加自定义 EndpointBehavior 的客户端,以在 Soap 消息中插入 MessageHeader。
private MyTestPortTypeClient CreateAuthenticatedClient()
{
var client = new MyTestPortTypeClient(_settings.EndpointConfigurationName, _settings.EndpointAddress);
client.Endpoint.EndpointBehaviors.Clear();
var authHeader = new AuthHeader(_settings.UserName, _settings.Password);
client.Endpoint.EndpointBehaviors.Add(new AddHttpHeaderMessageEndpointBehavior(authHeader));
return client;
}