我如何在 C# 中更改 soap xml Web 服务?
How I change soap xml web service in c#?
我使用了网络服务首选项 cs 代码。
我有 soap xml 网络服务请求。
<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# 来做?谢谢
<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 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 class 并添加 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);
这是助手link。
我使用了网络服务首选项 cs 代码。 我有 soap xml 网络服务请求。
<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# 来做?谢谢
<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 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 class 并添加 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);
这是助手link。