C# webservice调用后响应对象中的属性为null

C# webservice调用后响应对象中的属性为null,c#,web-services,C#,Web Services,我可以在Fiddler中看到该对象,但该对象在我端没有反序列化。以前有人见过吗?我能想到的唯一原因是合同不匹配。虽然如果没有抛出验证错误是很奇怪的。您使用的是从正确的WSDL生成的客户机吗?它是WCF客户端还是SOAP客户端?我敢肯定,前者进行验证,但模式不匹配可能会从后者滑过。响应为null或“响应包含null”或“请求为null”或“请求包含null”几乎总是意味着命名空间不匹配。例如,响应可能包含: <response xmlns="http://foo.com"/> 但

我可以在Fiddler中看到该对象,但该对象在我端没有反序列化。以前有人见过吗?

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

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

<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)和
  • 响应使用下划线(姓氏)

从wsdl工具生成代理类以及通过VS2010 GUI将其作为服务引用添加时,会发生这种情况。这是一个SOAP客户端。请使用svcutil.exe,而不是wsdl.exe。或者只使用“添加服务引用”并指向WSDL或元数据端点。我有与此完全相同的问题-我在WSDL和XML响应(在Fiddler中)中看到的名称空间完全相同。还使用SOAP客户端。响应对象是一个通用数组的简单包装器(来自(Java)服务器端,用@xmlementrefs({@xmlementref(type=Class1.class,…})注释)传递给C#客户端的XML看起来很好,因为:……C#创建了响应对象,但未能填充数组……我也遇到了同样的问题,目前正在努力解决这个问题(特别是因为似乎无法调试反序列化WS的M$C#代码).感谢您的回复,但请相信我,我已经删除并重新创建了大约一千次=(但很可能我遗漏了同样简单的内容,或者在其他地方犯了一个愚蠢的错误(我的第一个C#应用程序)我试过VS 2010和SharpDevelop,都没有用……好的,我会很感激,因为你问我是否可以再做一次。也就是说,更新服务引用,而不是删除和重新创建。假设这不起作用,最好查看对象的定义/契约所涉及的方法:)我在SharpDevelop中进行了刷新,与以前一样。当我在VS Express 2010中刷新WebService引用时,它将作为项目默认命名空间前缀的C#命名空间更改为服务引用(如DefaultNamespace.ServiceReference)。从任意一个IDE执行都会导致同一个响应对象的字段为空。您是否可以按要求发布所涉及的任何类型/方法的定义?请:)请参阅下面(为