2009-07-07 28 views
2

,我試圖調用的方法調用WCF服務時,有以下特徵:獲得的NullReferenceException從客戶

結果GetPerformanceData(myEntity所實體,布爾遞歸);

我在方法的開始處設置了一個斷點,但在代碼執行到達斷點之前引發了異常。

跟蹤WCF服務給了我以下信息:

System.NullReferenceException,mscorlib程序,版本= 2.0.0.0,文化=中性公鑰= b77a5c561934e089 對象引用不設置到對象的實例。 堆棧跟蹤: 在System.Runtime.Serialization.CodeGenerator.VerifyParameterCount(MethodInfo的MethodInfo的,的Int32 expectedCount) 在System.Runtime.Serialization.CodeGenerator.Call(對象thisObj,的MethodInfo MethodInfo的,對象參數1) 在...

如何確定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> 
+1

如果你可以提供調用代碼和WCF配置, – 2009-07-08 00:30:26

回答

0

有可能是這裏的幾個問題。確保你的數據合同具有適當的屬性。確保你的服務引用是最新的,如果不通過引用程序集重新使用你的數據合同,確保對象的生成是正確的(生成的代碼通常在一個名爲Reference.cs的文件中)。還可以嘗試在每個服務操作周圍放置一個try catch塊並將這些異常包裝在FaultExceptions中。這可以幫助您找到更好的答案。

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

FaultException可以提供幫助嗎?這正是WCF通常所做的。 – 2009-07-08 14:31:03

+0

WCF生成的客戶端代碼冒泡的唯一原因是上面提到的NullReferenceException,因爲我在服務的app.config中將includeExceptionDetailInFaults設置爲true。 – CodeWarrior 2009-07-08 14:35:28

6

事實證明,我有一些屬性標記爲[DataMember]有getters但沒有setter。

通常,我會通過查看服務上的跟蹤文件或在客戶端項目中添加服務引用時的彈出窗口中看到描述性錯誤。這一次我沒有。

我不得不搜索[DataMember]的所有實例,然後逐個查看它們以找到遺漏setter的屬性。

1

當我將傳遞給數據協定的具體類型更改爲缺少[DataContract]屬性的具體類型時,我也從System.Runtime.Serialization.CodeGenerator.VerifyParameterCount得到NullReferenceException

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

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

我知道這個問題是就這個問題,這可能解決問題

我只是有這個問題,並發現了一些新的有關[DataMember]註釋幫助老,但如果別人跌倒,我有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; 
     } 
    } 

的事情是,空引用在那裏,因爲數據成員是指自身持有值,其中class A只是持有class B到數字的引用,你現在只需將一個Datamember放在其中一個數字上。

0

我發現了另一個原因的錯誤:分配相同的DataMember.Name到兩個屬性造成的錯誤對我來說:

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

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

我知道這是一個很大的錯誤,但是,如果屬性有很多..它可能會發生:-)