Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ksoap2和WCF复杂类型_Wcf_Soap_Ksoap2 - Fatal编程技术网

ksoap2和WCF复杂类型

ksoap2和WCF复杂类型,wcf,soap,ksoap2,Wcf,Soap,Ksoap2,我正在使用ksoap2通过Android客户端将此请求发送到我的WCF Web服务: <v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/enve

我正在使用ksoap2通过Android客户端将此请求发送到我的WCF Web服务:

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/"><v:Header />
    <v:Body>
        <HelloComplex xmlns="http://tempuri.org/" id="o0" c:root="1">
            <complex i:type="n0:SampleComplexType" xmlns:n0="http://tempuri.org/">
                <Value i:type="d:string">Hello!</Value>
            </complex>
        </HelloComplex>
    </v:Body>
</v:Envelope>

你好
并收到这封信:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <s:Fault>
            <faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:DeserializationFailed</faultcode>
            <faultstring xml:lang="pt-BR">
                The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:complex. The InnerException message was 'Error in line 1 position 363. Element 'http://tempuri.org/:complex' contains data from a type that maps to the name 'http://tempuri.org/:SampleComplexType'. The deserializer has no knowledge of any type that maps to this name. Consider using a DataContractResolver or add the type corresponding to 'SampleComplexType' to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding it to the list of known types passed to DataContractSerializer.'.  Please see InnerException for more details.
            </faultstring>
        </s:Fault>
    </s:Body>
</s:Envelope>

答:反序列化失败
格式化程序在尝试反序列化消息时引发异常:尝试反序列化参数时出错http://tempuri.org/:complex. InnerException消息是“第1行第363位出错”。元素'http://tempuri.org/:complex'包含来自映射到名称的类型的数据'http://tempuri.org/:SampleComplexType'. 反序列化程序不知道映射到此名称的任何类型。考虑使用DATACONTRORTCORDEVER或将对应于“SampleComplexType”的类型添加到已知类型的列表中,例如,使用NoNyType属性或将其添加到已知的类型传递到DATACONTROTTRORALALZER的列表中。有关更多详细信息,请参阅InnerException。
但当我的另一个应用程序(AspNew MVC)调用此命令时:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <HelloComplex xmlns="http://tempuri.org/">
            <complex xmlns:a="http://schemas.datacontract.org/2004/07/IssueCenter.Core" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <a:Value>C#VALUE!</a:Value>
            </complex>
        </HelloComplex>
    </s:Body>
</s:Envelope>

C值!
蚂蚁:它有效

我可以做些什么来修复我的Android客户端请求


注意:我知道名称空间的差异,我已经尝试过了。

服务不知道如何处理XML中的“ComplexType”类型属性,因此基本上需要告诉服务端序列化程序它的含义。您可以通过以下几种方式来实现:要么添加一个DataContractResolver,告诉序列化程序这个未知类型ID的含义,要么将该类型(如果它存在于服务端)添加到“已知类型”列表中,以便服务确切地知道如何处理它。我认为你应该使用一个DataContractResolver

在4.0版的框架中,WCF引入了数据契约解析器。与“静态”定义已知类型集不同(例如,通过直接在KnownTypeAttribute中指定类型,就像在.NET 4之前那样),数据协定解析器提供了一些钩子,允许您在序列化或反序列化对象时指定,CLR类型与XML中用于表示此“未知”类型的名称/命名空间之间的映射。为此,只需从DataContractResolver类继承并提供映射逻辑


我认为这对您来说是更好的解决方案,因为您可能不想在服务器端创建一个虚拟类型来处理这个问题,如果要使用KnownTypeAttribute,您必须这样做。唯一需要记住的是,解析程序使序列化比使用“标准”已知类型功能慢(因为已知类型是静态的,所以可以缓存它们,并且不需要一直进行调用),因此请注意,在使用解析程序时,附加功能在执行时间方面是有代价的。

服务不知道如何处理XML中的“ComplexType”类型属性,因此基本上需要告诉服务端序列化程序它的含义。您可以通过以下几种方式来实现:要么添加一个DataContractResolver,告诉序列化程序这个未知类型ID的含义,要么将该类型(如果它存在于服务端)添加到“已知类型”列表中,以便服务确切地知道如何处理它。我认为你应该使用一个DataContractResolver

在4.0版的框架中,WCF引入了数据契约解析器。与“静态”定义已知类型集不同(例如,通过直接在KnownTypeAttribute中指定类型,就像在.NET 4之前那样),数据协定解析器提供了一些钩子,允许您在序列化或反序列化对象时指定,CLR类型与XML中用于表示此“未知”类型的名称/命名空间之间的映射。为此,只需从DataContractResolver类继承并提供映射逻辑

我认为这对您来说是更好的解决方案,因为您可能不想在服务器端创建一个虚拟类型来处理这个问题,如果要使用KnownTypeAttribute,您必须这样做。唯一需要记住的是,解析程序使序列化比使用“标准”已知类型功能慢(因为已知类型是静态的,可以缓存它们,并且不需要一直进行调用),因此请注意,在使用解析程序时,额外的功能在执行时间方面是有代价的