Law*_*ton 3 c# wcf serialization soap
我有一个客户端(在它发送的SOAP中不是很灵活),它从带签名的方法生成类似于以下内容的SOAP void Test(int[] test):
<?xml version="1.0" encoding="UTF-8" ?>
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP:Body>
<Test xmlns="http://www.mydomain.com/">
<test>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
<item>7</item>
</test>
</Test>
</SOAP:Body>
</SOAP:Envelope>
Run Code Online (Sandbox Code Playgroud)
我需要我的WCF SOAP Web服务来正确地反序列化它.
默认情况下,它会抛出以下异常:
System.ServiceModel.Dispatcher.NetDispatcherFaultException: The formatter threw an exception while trying to deserialize the message: Error in deserializing body of request message for operation 'Test'. End element 'test' from namespace 'http://www.mydomain.com/' expected. Found element 'item' from namespace 'http://www.mydomain.com/'. Line 6, position 7. ---> System.Xml.XmlException: End element 'test' from namespace 'http://www.mydomain.com/' expected. Found element 'item' from namespace 'http://www.mydomain.com/'. Line 6, position 7.
at System.Xml.XmlExceptionHelper.ThrowXmlException(XmlDictionaryReader reader, String res, String arg1, String arg2, String arg3)
at System.Xml.XmlBaseReader.ReadEndElement()
at System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.PartInfo.ReadValue(XmlDictionaryReader reader)
at System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeParameters(XmlDictionaryReader reader, PartInfo[] parts, Object[] parameters)
at System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest(XmlDictionaryReader reader, Object[] parameters)
at System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest(Message message, Object[] parameters)
--- End of inner exception stack trace ---
at System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest(Message message, Object[] parameters)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
Run Code Online (Sandbox Code Playgroud)
如果将XmlSerializerFormat属性添加到服务接口,则不会抛出任何异常,但结果数组为空(我怀疑它无法正确识别数组的各个元素).
如果将XmlArrayItem属性添加到参数中,它似乎不会更改任何内容(void Test([XmlArrayItem("item")] int[] test);在服务中).
我已经试过各种其他组合XmlSerializerFormat,XmlArrayItem和XmlArray,没有运气.
我需要做些什么才能使其按预期工作?
这是答案,希望对某人有用:
[CollectionDataContract(ItemName = "item", Namespace = "http://www.mydomain.com/")]
public class ClientArray<T> : List<T> {
}
void Test(ClientArray<int> test);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2750 次 |
| 最近记录: |