【问题标题】:WCF client not mapping and returning null objectsWCF 客户端未映射并返回空对象
【发布时间】:2013-09-27 20:45:23
【问题描述】:

我已经设置了一个服务引用(WCF 客户端)来从我设置的用于测试的控制台应用程序调用 Java Web 服务。它正在使用 HTTPS。我有 Fiddler 设置,可以看到从服务(在 Fiddler 中)发送和返回的正确值。但是无论我调用什么方法,返回的值,无论是字符串还是对象,都以 Null 形式返回。

我不确定代理客户端映射是否不起作用,或者我是否需要更改 app.config 中的配置值。

app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <bindings>
            <customBinding>
                <binding name="ResultsSOAP12Binding">
                    <textMessageEncoding messageVersion="Soap12" />
                </binding>
                <binding name="ResultsSOAP12Binding1">
                    <textMessageEncoding messageVersion="Soap12" />
                    <httpsTransport />
                </binding>
                <binding name="ResultsSOAP12Binding2">
                    <textMessageEncoding messageVersion="Soap12" />
                </binding>
            </customBinding>
        </bindings>
        <client>
            <endpoint address="https://services.acme.com/results"
                binding="customBinding" bindingConfiguration="ResultsSOAP12Binding1"
                contract="ResultsServiceReference.Result
        </client>
    </system.serviceModel>
</configuration>

代码:

static void CallResults()
        {
            var resultsRequest = new ResultsServiceReference.ResultsRequest();

            var client = new ResultsServiceReference.ResultsPortTypeClient("ResultsSOAP12BindingQSPort");

            Console.WriteLine("Call Results Service");

            ResultsServiceReference.ResultsBatch result = client.latestResults(resultsRequest);

            Console.WriteLine(result.Status);

        Console.ReadLine();

        }

在此代码中,变量 result 为空,即使您在 Fiddler 中查看时也可以看到 XML。在您尝试使用结果之前不会显示错误。

顺便说一句,我尝试在代理类 reference.cs 的 latestResults 方法中设置断点,但调试器没有到达它。

【问题讨论】:

  • 听起来像是反序列化问题,远程架构是否已更改并使您的 ResultsBatch 代理类无效?
  • 这是一个新设置。我同意这听起来像是一个反序列化问题。由于未到达代理类中的断点,排除故障的最佳方法是什么?
  • 您的意思是您可以使用 fiddler 看到正确的响应吗?
  • 代理是从 WSDL 文件生成的。如果 WSDL 不正确,这是预期的行为。您是否验证了您的 WSDL?
  • 是的,我可以在 Fiddler 中看到正确的响应。是的,WSDL 是有效的,并且已经在非 WCF 消费者中使用了几年。

标签: c# wcf


【解决方案1】:

您可能想要配置和启用 WCF 诊断事件跟踪和消息日志记录,然后重新运行测试事务并查看服务跟踪日志文件。以下链接演示了如何启用跟踪和消息记录。

http://msdn.microsoft.com/en-us/library/ms751526.aspx

根据我们的经验,没有明显错误的服务差异通常会出现在服务跟踪文件中。

注意:可能无法到达代理类reference.cs中的断点,因为设置了以下属性:

[System.Diagnostics.DebuggerStepThroughAttribute()]

【讨论】:

    【解决方案2】:

    很可能 WSDL 有一个错误,其中的架构与实际的响应 XML 不匹配。您可以在此处与 SOAP 响应一起发布 WSDL(和任何引用的 XSD)(或将它们邮寄给我,以便我尝试查看)。或者,您可以从完全相同的 WSDL(或从您已经生成的客户端合同)设置 WCF 服务存根,并将 WCF 发送的响应与实际服务发送的响应进行比较。 您想在 XML 命名空间(并理解微妙的部分,例如这是默认命名空间还是前缀命名空间)和正文下第一个元素的名称中寻找差异。

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 2021-02-17
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      相关资源
      最近更新 更多