我如何在c#中更改soap xml web服务?

我使用了webservice preferences cs代码。 我有soap xml web服务请求。

   20180708 20180708 0    

但我想改变这个,我怎么做c#? 谢谢。

   20180708 20180708 0    

我终于找到了怎么做。 首先,我创建了EnvelopeNamespaceMessage类。

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(); IOperationBehavior serializerBehavior = operationDescription.Behaviors.Find(); if (serializerBehavior == null) serializerBehavior = operationDescription.Behaviors.Find(); 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 methodAsync(methodRequest request); 

这是帮助链接。

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