Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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
C# 在没有WSDL的情况下从webservice反序列化SOAP响应_C#_.net_Xml_Soap_Deserialization - Fatal编程技术网

C# 在没有WSDL的情况下从webservice反序列化SOAP响应

C# 在没有WSDL的情况下从webservice反序列化SOAP响应,c#,.net,xml,soap,deserialization,C#,.net,Xml,Soap,Deserialization,我正在尝试编写一个C#.NET应用程序,它可以反序列化来自Web服务的SOAP响应。webservice(这里称为“Wibble”)没有WSDL(grrrr)。我有一个完整的示例响应的副本,我相信我可以使用它来生成中间类,但是尽管尝试了许多不同的方法,我还是无法从响应中获得一个正常的对象 响应的前几行如下所示: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="htt

我正在尝试编写一个C#.NET应用程序,它可以反序列化来自Web服务的SOAP响应。webservice(这里称为“Wibble”)没有WSDL(grrrr)。我有一个完整的示例响应的副本,我相信我可以使用它来生成中间类,但是尽管尝试了许多不同的方法,我还是无法从响应中获得一个正常的对象

响应的前几行如下所示:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <ns1:inspectResponse xmlns:ns1="ProjectService" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
            <inspectReturn href="#id0"/>
        </ns1:inspectResponse>
        <multiRef xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="Wibble" id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:Project">
            <category xsi:type="ns2:Category" xsi:nil="true"/>
            <classId xsi:type="xsd:long">1000000</classId>
            [...]
        </multiRef>
        <multiRef xmlns:ns3="Wibble" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" id="id3" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns3:ProjectData">
            <author xsi:type="ns3:User" xsi:nil="true" />
            <authorUserId xsi:type="xsd:long">5289027</authorUserId>
            <classId xsi:type="xsd:long">0</classId>
            <comments xsi:type="xsd:string">Some comments.</comments>
            [...]        
        </multiRef>
    </soapenv:Body>
</soapenv:Envelope>
var formatter = new SoapFormatter();
var blah = formatter.Deserialize(memstream);
return blah.ToString();
我得到一个
SerializationException
解析错误,没有与Xml键ns1 inspectResponse关联的程序集

所以我猜它缺少一个名为
inspectResponse
的类,它可以将第一个元素映射到这个类上。因此,我破解了
xsd.exe
,并从XML文件生成了一些xsd。从这里,我生成了一个52KB的C#类,它包含了一大堆代码(我猜),其中包含了XML文件可以映射到的所有类。我将其包括在内,然后重新运行上面的代码,得到完全相同的错误

然后我想到,现在我有了自动生成的类,我可以使用
XmlSerializer
对象并尝试以这种方式反序列化。我这样写:

var ss = new XmlSerializer(typeof(Classes.Envelope));
object blah;
using (var xr = XmlReader.Create(new StringReader(response)))
{
    ss.Deserialize(xr);
    blah = ss.Deserialize(xr);
}
return blah.ToString();
这次我得到一个新的
invalidoOperationException
XML文档中有一个错误(2356)。-->System.InvalidOperationException:无法识别指定的类型:name='Project',namespace='Wibble',at.

自动生成的代码不包含
Project
类,尽管它确实包含
multiRef
类。大概是因为不存在
项目
类,所以它会呕吐。我尝试创建一个占位符:

[Serializable]
[XmlType(TypeName = "Project", Namespace = "Wibble")]
public class Project
{
}
但这没有效果


我是不是太离谱了,还是我错过了一些小东西?我知道这是一个相当复杂的XML响应,包含多个不同类型的
multiRef
元素,但我本以为
SoapSerializer
应该能够处理它。

好的,为什么不尝试将响应加载到XMLDomDocument中,并使用XPATH表达式或XSLT查询您感兴趣的节点呢。然后,自定义映射器类可以将节点属性映射到POCO类中

只是一个想法和一个糟糕的解决方法,以防您找不到其他任何东西,但我很惊讶SOAP返回消息没有WSDL。这是公共服务吗


您是否也尝试过在服务URL的末尾添加?WSDL,看看会发生什么。

类似的问题:从一些XSD生成WSDL似乎是一个绝妙的主意,直到它被证明是失败的。应该有其他选择,这里有一些,但不确定是否全部:我认为这可能是我的退路。对于缺少WSDL,我与服务开发人员进行了多次交锋。只是没有一个。不过,他们正在“考虑”开发一个。