C# webservice调用后响应对象中的属性为null
我可以在Fiddler中看到该对象,但该对象在我端没有反序列化。以前有人见过吗?我能想到的唯一原因是合同不匹配。虽然如果没有抛出验证错误是很奇怪的。您使用的是从正确的WSDL生成的客户机吗?它是WCF客户端还是SOAP客户端?我敢肯定,前者进行验证,但模式不匹配可能会从后者滑过。响应为null或“响应包含null”或“请求为null”或“请求包含null”几乎总是意味着命名空间不匹配。例如,响应可能包含:C# webservice调用后响应对象中的属性为null,c#,web-services,C#,Web Services,我可以在Fiddler中看到该对象,但该对象在我端没有反序列化。以前有人见过吗?我能想到的唯一原因是合同不匹配。虽然如果没有抛出验证错误是很奇怪的。您使用的是从正确的WSDL生成的客户机吗?它是WCF客户端还是SOAP客户端?我敢肯定,前者进行验证,但模式不匹配可能会从后者滑过。响应为null或“响应包含null”或“请求为null”或“请求包含null”几乎总是意味着命名空间不匹配。例如,响应可能包含: <response xmlns="http://foo.com"/> 但
<response xmlns="http://foo.com"/>
但事实上应该如此
<response xmlns="http://bar.com"/>
在这种情况下,将接收null。每次发生这种情况时,都是因为我需要更新我的服务引用。试试看,让我知道会发生什么:)解决了它。。。或者至少有解决办法。在Java代码中,@XmlElementRefs和@XmlElementRef应该分别是@XmlElements和@XmlElement(以及需要“name”属性的“type”属性)
猜测一下,如果我将此作为一个带有Java标记以及C#和web服务的新问题发布,一些鹰眼的stackoverflower会发现这个学生错误。我遇到了一个类似的问题,我通过检查Reference.cs中的Order值来解决。 [System.Xml.Serialization.XmlElementAttribute(顺序=0)] 返回参数的顺序已更改,但在visual studio中更新我的服务引用不会更改“顺序”值
检查Fiddler/SoapUI中返回的参数是否与代理生成的类中的参数相同。我遇到过类似的情况,即我通过SVCUTIL/Service Reference从VS创建了一个客户端。成功接收到响应,数据正确(通过IClientMessageInspector.afterReceiverly方法确认)但是,未填充对象级别的值。没有反序列化错误(通过system.diagnostics输出确认) 问题有两方面: 1) 某些对象的命名与其类型完全相同,但名称空间与其类型不同。这似乎混淆了代理生成器将类的命名空间参数(在System.Xml.Serialization.XmlElementAttribute注释中)分配给对象之一的过程 2) 属性的顺序参数(在System.Xml.Serialization.XmlElementAttribute注释中)不是必需的,并且名称空间参数丢失 因此来自:[System.Xml.Serialization.xmlementAttribute(IsNullable=true,Order=0)] 收件人:[System.Xml.Serialization.XmlElementAttribute(IsNullable=true,命名空间=”http://www.whathevernamespaceiscorrect.com”)]
因此,基本上,在生成的代理中,我需要将类的名称空间修复为类型中指定的名称空间,并使用名称空间参数替换order参数,根据wsdl将其设置为正确的名称空间。我遇到了相同的问题,正如所建议的,名称空间问题是根本原因。但是,我的代理类具有嵌套类和嵌套命名空间的长链 在代理类的Cs代码中识别要应用的正确名称空间是令人困惑的。在这里,我描述了如何找出需要在客户端代理中更新的名称空间 我所做的是在ClientMessageInspector类AfterReceivePly方法中截获请求(在收到回复消息后但在将其传递回客户端应用程序之前启用对消息的检查或修改)。使用XMLDocument验证响应中返回null的对象的命名空间。我用从XML检索的名称空间更新了代理类。进行更改后,响应中的对象不是null
public class MyMessageInspector : IClientMessageInspector
{
public void AfterReceiveReply(ref System.ServiceModel.Channels.Message request, object correlationState)
{
MemoryStream ms = new MemoryStream();
XmlWriter writer = XmlWriter.Create(ms);
request.WriteMessage(writer);
writer.Flush();
ms.Position = 0;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(ms);
this.ReadMessage(xmlDoc);
ms = new MemoryStream();
xmlDoc.Save(ms);
ms.Position = 0;
XmlReader reader = XmlReader.Create(ms);
Message newMessage = Message.CreateMessage(reader, int.MaxValue, request.Version);
newMessage.Properties.CopyProperties(request.Properties);
request = newMessage;
}
private void ReadMessage(XmlDocument xmlDoc)
{
XmlNode v1 = xmlDoc.GetElementsByTagName("XPAth");
//Actual Namespace in XML, which should be used in Proxy Class
string namespaceURIForObjectInXML = v1.NamespaceURI;
}
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
}
}
确保定义/规范与输出相匹配。比较WSDL(在浏览器中)和响应(在SOAP-UI、Fiddler中),例如
- WSDL使用驼峰大小写(lastName)和
- 响应使用下划线(姓氏)