如何在C#中更改Soap xml Web服务? [英] How I change soap xml web service in c#?

查看:69
本文介绍了如何在C#中更改Soap xml Web服务?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用了Web服务首选项CS代码.我有soap xml Web服务请求.

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

 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <List xmlns="http://ws.ddd.com/" wsNo="451" member="XYZ">
    <dateStart xmlns="">20180708</dateStart>
    <dateFinish xmlns="">20180708</dateFinish>
    <typeX xmlns="">0</type>
    </List>
    </s:Body>
    </s:Envelope>

但是我想更改此设置,我该怎么做c#?谢谢.

But I want to change this, How I do it c#? Thanks.

<s:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:a="http://ws.ddd.com/">
<a:List member="XYZ" wsNo="451">
<dateStart>20180708</dateStart>
<dateFinish>20180708</dateFinish>
<typeX >0</type>
</a:List> 
</s:Body>
</s:Envelope>

推荐答案

我终于找到了解决方法.首先,我创建了EnvelopeNamespaceMessage类.

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)
        {
        }
    }

然后我打开proxy.cs类,并添加EnvelopeNamespaces属性在方法上.

[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);

这是帮助程序链接.

查看全文

登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆