Web服务调用后响应对象中的属性为null

时间:2010-12-28 15:18:58

标签: c# web-services

我可以在Fiddler中看到该对象,但该对象未在我的末尾反序列化。有没有人见过这个?

8 个答案:

答案 0 :(得分:4)

“响应为空”或“响应包含空值”或“请求为空”或“请求包含空”几乎总是意味着您具有命名空间不匹配。例如,响应可能包含:

<response xmlns="http://foo.com"/>

但实际上应该是

<response xmlns="http://bar.com"/>

在这种情况下,将收到null。

答案 1 :(得分:1)

我有同样的问题,并且建议命名空间问题是根本原因。但是,我的代理类有嵌套类和嵌套命名空间的长链。

确定要在代理类的Cs代码中应用的正确名称空间是令人困惑的。在这里,我将描述如何确定需要在客户端代理中更新的命名空间。

我所做的是拦截ClientMessageInspector类中的请求,AfterReceiveReply方法(在收到回复消息之后但在将消息传递回客户端应用程序之前启用检查或修改消息。)验证了对象的命名空间。使用XMLDocument在Response中返回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)
    {

    }



}

答案 2 :(得分:0)

我能想到的唯一原因是合约不匹配。虽然如果没有抛出验证错误,这很奇怪。您使用的是从正确的WSDL生成的客户端吗?它是WCF客户端还是SOAP客户端?我肯定前者会进行验证,但架构不匹配可能会漏掉后者。

答案 3 :(得分:0)

每次发生这种情况,都是因为我需要更新我的服务引用。试试看,让我知道会发生什么:)

答案 4 :(得分:0)

解决了......或者至少有解决方法。在Java代码中,@ xmlElementRefs和@XmlElementRef应分别是@XmlElements和@XmlElement(以及“type”属性,它需要“name”属性)。

猜测我是否将这个问题作为一个带有Java标签以及C#和网络服务的新问题发布,一些鹰派的stackoverflower会发现这个男生错误。

答案 5 :(得分:0)

我有一个类似的问题,我通过检查Reference.cs中的Order值来解决。 [System.Xml.Serialization.XmlElementAttribute(订单= 0)]

返回参数的顺序已更改,但在Visual Studio中更新我的服务引用并未更改&#34;订单&#34;值。

检查Fiddler / SoapUI中返回的参数是否与代理生成的类相同。

答案 6 :(得分:0)

我有类似的情况,我通过VS的SVCUTIL /服务参考创建了一个客户端。使用正确的数据(通过IClientMessageInspector.AfterReceiveReply方法确认)成功接收到响应,但是未填充对象级别的值。没有反序列化错误(通过system.diagnostics输出确认)

问题是双重的:

1)某些对象的名称与其类型完全相同,但与其类型具有不同的名称空间。这似乎使代理生成器混淆了将类的namespace参数(在System.Xml.Serialization.XmlElementAttribute批注中)分配给对象之一

2)不需要属性的order参数(在System.Xml.Serialization.XmlElementAttribute批注中),并且缺少namespace参数

所以来自:[System.Xml.Serialization.XmlElementAttribute(IsNullable = true,Order = 0)]

to:[System.Xml.Serialization.XmlElementAttribute(IsNullable = true,Namespace =“http://www.whathevernamespaceiscorrect.com”)]

基本上,在生成的代理中,我需要将类的名称空间修复为类型中指定的名称空间,并将命令参数替换为命名空间参数,根据wsdl将其设置为正确的名称空间

答案 7 :(得分:0)

确保定义/规范与输出匹配。比较WSDL(在浏览器中)和响应(在SOAP-UI,Fiddler中),例如

  • WSDL使用驼峰大小写(lastName)和
  • 响应使用下划线(last_name)。
相关问题