如何使用 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 将用户代理添加到自动生成的肥皂客户端的主要内容,如果未能解决你的问题,请参考以下文章

从 wsdl 在 typescript 中创建肥皂客户端

如何使用 WSDL 文件创建 WCF 代理?

如何在 wcf 中添加自定义肥皂标题?

代理上的 PHP 肥皂

如何使用 WSDL

将安全标头信息添加到从 WSDL 生成的 Java 代码