【问题标题】:how to add usergent to automatically generated soap client using WSDL如何使用 WSDL 将用户代理添加到自动生成的肥皂客户端
【发布时间】:2021-02-21 05:54:18
【问题描述】:

我想将 UserAgent 添加到从远程soap 服务生成的soap 代理客户端中。如何将自定义 UserAgent 添加到生成的客户端中?

谢谢

【问题讨论】:

    标签: c# wcf soap


    【解决方案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。顺便感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 2019-01-27
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多