How I change soap xml web service in c#?

前端 未结 1 1023
有刺的猬
有刺的猬 2021-01-17 05:49

I used webservice preferences cs code. I have soap xml web service request.

 
    <         


        
相关标签:
1条回答
  • 2021-01-17 06:03

    I finally found how to do it. Firstly I created EnvelopeNamespaceMessage class.

    EnvelopeNamespaceMessage.cs

      public class EnvelopeNamespaceMessage : Message
        {
            private readonly Message message;
    
            public string[] EnvelopeNamespaces { get; set; }
    
            public EnvelopeNamespaceMessage(Message message)
            {
                this.message = message;
            }
    
            public override MessageHeaders Headers
            {
                get { return this.message.Headers; }
            }
    
            public override MessageProperties Properties
            {
                get { return this.message.Properties; }
            }
    
            public override MessageVersion Version
            {
                get { return this.message.Version; }
            }
    
            protected override void OnWriteStartBody(XmlDictionaryWriter writer)
            {
                writer.WriteStartElement("Body", "http://schemas.xmlsoap.org/soap/envelope/");
            }
    
            protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
            {
                this.message.WriteBodyContents(writer);
            }
    
            protected override void OnWriteStartEnvelope(XmlDictionaryWriter writer)
            {
                writer.WriteStartElement("soapenv", "Envelope", "http://schemas.xmlsoap.org/soap/envelope/");
    
                if (EnvelopeNamespaces != null)
                {
                    foreach (string ns in EnvelopeNamespaces)
                    {
                        var tokens = ns.Split(new char[] { ':' }, 2);
                        writer.WriteAttributeString("xmlns", tokens[0], null, tokens[1]);
                    }
                }
            }
        }
    
        public class EnvelopeNamespaceMessageFormatter : IClientMessageFormatter
        {
            private readonly IClientMessageFormatter formatter;
    
            public string[] EnvelopeNamespaces { get; set; }
    
            public EnvelopeNamespaceMessageFormatter(IClientMessageFormatter formatter)
            {
                this.formatter = formatter;
            }
    
            public Message SerializeRequest(MessageVersion messageVersion, object[] parameters)
            {
                var message = this.formatter.SerializeRequest(messageVersion, parameters);
                return new EnvelopeNamespaceMessage(message) { EnvelopeNamespaces = EnvelopeNamespaces };
            }
    
            public object DeserializeReply(Message message, object[] parameters)
            {
                return this.formatter.DeserializeReply(message, parameters);
            }
        }
    
    
        [AttributeUsage(AttributeTargets.Method)]
        public class EnvelopeNamespacesAttribute : Attribute, IOperationBehavior
        {
            public string[] EnvelopeNamespaces { get; set; }
    
            public void AddBindingParameters(OperationDescription operationDescription,
                BindingParameterCollection bindingParameters)
            {
            }
    
            public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
            {
                //var serializerBehavior = operationDescription.Behaviors.Find<DataContractSerializerOperationBehavior>();
                IOperationBehavior serializerBehavior = operationDescription.Behaviors.Find<XmlSerializerOperationBehavior>();
                if (serializerBehavior == null)
                    serializerBehavior = operationDescription.Behaviors.Find<DataContractSerializerOperationBehavior>();
    
                if (clientOperation.Formatter == null)
                    serializerBehavior.ApplyClientBehavior(operationDescription, clientOperation);
    
                IClientMessageFormatter innerClientFormatter = clientOperation.Formatter;
                clientOperation.Formatter = new EnvelopeNamespaceMessageFormatter(innerClientFormatter)
                {
                    EnvelopeNamespaces = EnvelopeNamespaces
                };
            }
    
            public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
            {
            }
    
            public void Validate(OperationDescription operationDescription)
            {
            }
        }
    

    And then I opened proxy.cs class and I add EnvelopeNamespaces attribute at method.

    [System.ServiceModel.ServiceContractAttribute(Namespace = "http://ws.xyz.com/", ConfigurationName = "WebServiceImpl")]
        //[ServiceContract(Namespace = "")]
        public interface WebServiceImpl
        {
     // CODEGEN: 
            [System.ServiceModel.OperationContractAttribute(Action = "http://ws.xyz.com/WebServiceImpl/methodRequest", ReplyAction = "http://ws.xyz.com/WebServiceImpl/methodResponse")]
            [System.ServiceModel.XmlSerializerFormatAttribute()]
            [EnvelopeNamespaces(EnvelopeNamespaces = new string[] {
            "soapenv:http://schemas.xmlsoap.org/soap/envelope/",
            "soapenc:http://schemas.xmlsoap.org/soap/encoding/",
            "xsd:http://www.w3.org/2001/XMLSchema",
            "xsi:http://www.w3.org/2001/XMLSchema-instance",
            "ws:http://ws.xyz.com/"
             })]
       methodResponse method(methodRequest request);
    
        [System.ServiceModel.OperationContractAttribute(Action = "http://ws.xyz.com/WebServiceImpl/methodRequest", ReplyAction = "http://ws.xyz.com/WebServiceImpl/methodResponse")]
        System.Threading.Tasks.Task<methodResponse> methodAsync(methodRequest request);
    

    This is helper link.

    https://weblog.west-wind.com/posts/2016/Apr/02/Custom-Message-Formatting-in-WCF-to-add-all-Namespaces-to-the-SOAP-Envelope#ClientMessageFormatter

    0 讨论(0)
提交回复
热议问题