如何使用 WSDL 将用户代理添加到自动生成的肥皂客户端
Posted
技术标签:
【中文标题】如何使用 WSDL 将用户代理添加到自动生成的肥皂客户端【英文标题】:how to add usergent to automatically generated soap client using WSDL 【发布时间】:2021-02-21 05:54:18 【问题描述】:我想将 UserAgent 添加到从远程soap 服务生成的soap 代理客户端中。如何将自定义 UserAgent 添加到生成的客户端中?
谢谢
【问题讨论】:
【参考方案1】:如果要添加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();
【讨论】:
这很棒。谢谢,但调用远程soap服务更简单的方法是将项目的服务引用添加为Web引用而不是服务。使用 Web Reference 更直接地使用 UserAgent 和 Certificate。顺便感谢您的回复。以上是关于如何使用 WSDL 将用户代理添加到自动生成的肥皂客户端的主要内容,如果未能解决你的问题,请参考以下文章