从客户端调用WCF服务时获取NullReferenceException

时间:2009-07-07 23:27:30

标签: wcf

我尝试调用的方法具有以下签名:

结果GetPerformanceData(MyEntity实体,bool recurse);

我在方法的开头设置了一个断点,但是在代码执行到达断点之前抛出了异常。

跟踪WCF服务向我提供以下信息:

System.NullReferenceException,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089 你调用的对象是空的。 堆栈跟踪: 在System.Runtime.Serialization.CodeGenerator.VerifyParameterCount(MethodInfo methodInfo,Int32 expectedCount)    在System.Runtime.Serialization.CodeGenerator.Call(Object thisObj,MethodInfo methodInfo,Object param1)    在......

如何确定null变量是什么?我的调试器设置为中断所有异常,但它并没有打破这个特定的问题。看起来我试图调用的方法的“实体”参数无法正确反序列化。

示例调用调用

var results = client。 GetPerformanceData(entity,true);

WCF服务配置

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
              switchValue="All"
              propagateActivity="true">
        <listeners>
          <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "trace.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="basicHttpBindingSettings" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
          allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
          maxBufferSize="5242880" maxBufferPoolSize="52428800" maxReceivedMessageSize="5242880"
          messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
          useDefaultWebProxy="true">
          <readerQuotas maxDepth="64" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="Company.Service.Engine"
               behaviorConfiguration="ServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000/Engine"/>
          </baseAddresses>
        </host>
        <endpoint address=""
                  binding="basicHttpBinding"
                  bindingConfiguration="basicHttpBindingSettings"
                  contract="Company.Service.IEngine"/>

        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

5 个答案:

答案 0 :(得分:6)

事实证明,我有一些标记为[DataMember]的属性,它们有吸气剂,但没有制定者。

通常,通过查看服务上的跟踪文件或在客户端项目上添加服务引用时的弹出窗口中,我会收到描述性错误。这次我没有。

我必须搜索[DataMember]的所有实例并逐一查看它们,以找到缺少setter的属性。

答案 1 :(得分:2)

我知道这个问题已经过时但如果其他人偶然发现这个问题,这可能有助于解决问题

我刚刚遇到这个问题并发现了关于[DataMember] Annotation的新内容,我有2个类,其中一个类引用了另一个(让我们称之为A类和B类),其中一些class B中引用了class A中的属性和字段。

这是我所拥有的一个小例子

    [DataContract]
    public class A
    {
        [Datamember]
        public B classb {get;set;}

        [DataMember]
        public int Number
        {
         get {return classb.Number;}
         set {classb.Number = value;}
        }
    }

    [DataContract]
    public class B
    {


        [DataMember]
        public int Number
        {
         get;
         set;
        }
    }

事实是null引用是存在的,因为datamember意味着它自己拥有一个值class A只保存对class B中数字的引用,你现在所做的只是一个Datamember其中一个数字。

答案 2 :(得分:1)

当我将传递给数据合同的具体类型更改为缺少NullReferenceException属性的具体类型时,我也从System.Runtime.Serialization.CodeGenerator.VerifyParameterCount获得[DataContract]

[DataContract, KnownType(typeof(NewEngine))]
public class Car
{
    [DataMember]
    public IEngine Engine { get; set; }
}

[DataContract] // DON'T FORGET THIS
public class NewEngine : IEngine { ... }

答案 3 :(得分:0)

这里可能有几个问题。确保您的datacontracts具有适当的属性。确保您的服务引用是最新的,如果不通过引用程序集重用您的datacontracts,请确保对象的生成是正确的(生成的代码通常在名为Reference.cs的文件中)。还尝试在每个服务操作周围放置一个try catch块,并将这些异常包装在FaultExceptions中。这可以帮助您找到更好的答案。

try
{
 ...
}
catch (Exception ex)
{
 // The generic argument might be unnecessary
 throw new FaultException<Exception>(ex);
}

答案 4 :(得分:0)

我找到了该错误的另一个原因:为两个属性分配相同的DataMember.Name导致我的错误:

[DataContract]
public class Car
{
    [DataMember(Name = "Type")]
    public string EngineType { get; set; }

    [DataMember(Name = "Type")]
    public string TyresType { get; set; }
}

我知道这是一个很大的错误但是,如果属性很多......可能会发生: - )