【发布时间】:2021-02-21 05:54:18
【问题描述】:
我想将 UserAgent 添加到从远程soap 服务生成的soap 代理客户端中。如何将自定义 UserAgent 添加到生成的客户端中?
谢谢
【问题讨论】:
我想将 UserAgent 添加到从远程soap 服务生成的soap 代理客户端中。如何将自定义 UserAgent 添加到生成的客户端中?
谢谢
【问题讨论】:
如果要添加soap header,可以参考下面的demo:
public class ClientMessageLogger : IClientMessageInspector
{
public void AfterReceiveReply(ref Message reply, object correlationState)
{
MessageHeader header = MessageHeader.CreateHeader("UserAgent", "http://my-namespace.com", "User1");
reply.Headers.Add(header);
string outputstr = $"reply:{reply}";
Console.WriteLine(outputstr);
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
MessageHeader header = MessageHeader.CreateHeader("MySoapHeader", "http://my-namespace.com", "asdas");
request.Headers.Add(header);
string outputText = $"request:{request}";
Console.WriteLine(outputText);
return null;
}
}
我们可以在客户端实现IClientMessageInspector接口,然后在BeforeSendRequest中添加soap头
[AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class, AllowMultiple = false)]
public class CustContractBehaviorAttribute : Attribute, IContractBehavior, IContractBehaviorAttribute
{
public Type TargetContract => typeof(ServiceReference1.ICalculator);
public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
return;
}
public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.ClientMessageInspectors.Add(new ClientMessageLogger());
}
public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
dispatchRuntime.MessageInspectors.Add(new ServerMessageLogger());
}
public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
{
return;
}
}
我们需要在服务行为中添加ClientMessageLogger。
最后,我们将 CustContractBehavior 应用到客户端代理类的接口上。
在 SOAP 标头中我们可以看到我们添加的 UserAgent。
如果要添加http头,可以使用OperationContextScope:
using ( new OperationContextScope( client.InnerChannel ) )
{
HttpRequestMessageProperty request = new HttpRequestMessageProperty();
request.Headers["UserAgent "] = "UserAgent ";
OperationContext.Current.OutgoingMessageProperties[
HttpRequestMessageProperty.Name] = request;
client.Test();
}
【讨论】: