在c#控制台应用程序中看似成功使用Web服务后,检查返回的对象会显示属性都为null!
在大量搜索答案之后,我已经将问题跟踪到SOAP XML中的命名空间问题 - 使用fiddler,我的略微修改的SOAP响应如下所示:
<?xml version="1.0" encoding="utf-8"?>
<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>
<MyResponse xmlns="http://foo.com">
<FIRST_NM xmlns="">Michael</FIRST_NM>
</MyResponse>
</soapenv:Body>
</soapenv:Envelope>
我添加的唯一部分是:
... FIRST_NM xmlns =“”&gt; Michael ...(粗体部分)使用fiddler。
一旦我在调试会话期间以中间人的身份做到这一点 - 瞧!第一次在我的客户端应用程序中向我显示了“迈克尔”的FIRST_NM值。我决定尝试这个,因为我注意到从我的客户端发出的请求有这样的属性,而且响应没有。
好的,所以诊断完成了。我转向我让它发挥作用的一步。假设我无法控制服务器端,我尝试打开Reference.cs文件并进行一些更改,例如更改此内容:[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=3)]
public string FIRST_NM {
get {
return this.fIRST_NMField;
}
set {
this.fIRST_NMField = value;
this.RaisePropertyChanged("FIRST_NM");
}
}
到此:
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Namespace="http://foo.com", Order=3)]
public string FIRST_NM {
...
我将 Namespace =“http://foo.com”,添加到XmlElementAttribute。我的想法是,如果没有xmlns =“”命名空间“http://foo.com”继承自父“MyResponse”标签,我会得到一个匹配。
然而,这不起作用。你们都可以指出我的任何方向都将非常感激。答案 0 :(得分:1)
我能够通过从.NET生成的代码中完全删除以下行来解决此问题:
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=3)]
我想,因为命名空间是从父标记继承的,所以它实际上是“合格的”而不是“不合格”。删除导致默认的表单行为,无(按照文档)。
感谢社区 - 我认为这主要基于我在相关SO问题中找到的建议。