2011-12-23 3 views
1

私はこの行でStackOverflowExceptionを取得しています。私はWCFの新機能ですが、無限ループで呼び出されていないことが分かります。まあ、私はここにいる誰かがこの問題を明らかにすることを望んでいた。WCF、StackOverflowException

get { return LevStad; } 

コードです。

// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together. 
    [ServiceContract] 
    public interface IService 
    { 
     [OperationContract] 
     string GetData(int value); 
    [OperationContract] 
    Kund GetDataUsingDataContract(Kund kund); 

    // TODO: Add your service operations here 
} 
[DataContract] 
public class Kund 
{ 
    int iD; 
    string fornamn = ""; 
    string efterNamn = ""; 
    string telefon = ""; 
    string boAdress = ""; 
    string boPostnummer = ""; 
    string boStad = ""; 
    string boLand = ""; 
    string levAdress = ""; 
    string levPostnummer = ""; 
    string levStad = ""; 
    string levLand = ""; 

    [DataMember] 
    public int ID 
    { 
     get { return iD; } 
     set { iD = value; } 
    } 

    [DataMember] 
    public string Fornamn 
    { 
     get { return fornamn; } 
     set { fornamn = value; } 
    } 
    [DataMember] 
    public string EfterNamn 
    { 
     get { return efterNamn; } 
     set { efterNamn = value; } 
    } 
    [DataMember] 
    public string Telefon 
    { 
     get { return telefon; } 
     set { telefon = value; } 
    } 
    [DataMember] 
    public string BoAdress 
    { 
     get { return boAdress; } 
     set { boAdress = value; } 
    } 
    [DataMember] 
    public string BoPostnummer 
    { 
     get { return boPostnummer; } 
     set { boPostnummer = value; } 
    } 
    [DataMember] 
    public string BoStad 
    { 
     get { return boStad; } 
     set { boStad = value; } 
    } 
    [DataMember] 
    public string BoLand 
    { 
     get { return boLand; } 
     set { BoLand = value; } 
    } 
    [DataMember] 
    public string LevAdress 
    { 
     get { return levAdress; } 
     set { levAdress = value; } 
    } 
    [DataMember] 
    public string LevPostnummer 
    { 
     get { return levPostnummer; } 
     set { levPostnummer = value; } 
    } 
    [DataMember] 
    public string LevStad 
    { 
     get { return LevStad; } 
     set { levStad = value; } 
    } 
    [DataMember] 
    public string LevLand 
    { 
     get { return levLand; } 
     set { levLand = value; } 
    } 
} 

    public class Service : SQLBase, IService 
    { 
     public Service() : base() 
     { 

     } 
     public string GetData(int value) 
     { 
      return string.Format("You entered: {0}", value); 
     } 
     public Kund GetDataUsingDataContract(Kund kund) 
     { 
      kund = new Kund(); 
      SqlCommand SQLCom = new SqlCommand(@"SELECT Kund.ID, Förnamn, Efternamn, Telefon, Adress, Postnummer, Stad, Land 
FROM Webbshop.dbo.Kund INNER JOIN Webbshop.dbo.Adress ON Kund.BoAdress = Adress.ID"); 
      SQLCom.Connection = DatabaseConnection; 
      SQLCom.Connection.Open(); 
      SqlDataReader rdr = SQLCom.ExecuteReader(); 
      while (rdr.Read()) 
      { 
       kund.ID = (int) rdr[0]; 
       kund.Fornamn = rdr[1].ToString().Trim(); 
       kund.EfterNamn = rdr[2].ToString().Trim(); 
       kund.Telefon = rdr[3].ToString().Trim(); 
       kund.BoAdress = rdr[4].ToString().Trim(); 
       kund.BoPostnummer = rdr[5].ToString().Trim(); 
       kund.BoStad = rdr[6].ToString().Trim(); 
       //kund.BoLand = rdr[7].ToString().Trim(); 
       //kund.LevAdress = rdr[8].ToString(); 
       //kund.LevPostnummer = rdr[9].ToString(); 
       //kund.LevStad = rdr[10].ToString(); 
       //kund.LevLand = rdr[11].ToString(); 
      } 
      SQLCom.Connection.Close(); 
      return kund; 
     } 
    } 

public class SQLBase 
{ 
    protected static SqlConnection DatabaseConnection = new SqlConnection(); 
    public SQLBase() 
    { 
     DatabaseConnection.ConnectionString = 
      "Data Source=(local);Initial Catalog=Webbshop;Integrated Security=True"; 
    } 
} 

Kund kund = null;// = new Kund(); 
using (ServiceReference.ServiceClient wcfClient = new ServiceReference.ServiceClient()) 
{ 
    kund = wcfClient.GetDataUsingDataContract(kund); 
} 
+2

コードを読んで助けてもらいたい場合は、無関係の99%を削除することを検討してください。 –

答えて

6

大文字です。

get { return levStad; }

今、それは自分自身を返すだ、 getを呼び出し、自分自身を返す...スタックオーバーフロー:それは変数を返す必要があります。


BoLandでも問題があります。

public string BoLand 
{ 
    get { return boLand; } 
    set { boLand = value; } 
}
2
public string LevStad 
{ 
    get { return LevStad; } 
    set { levStad = value; } 
} 

あなたの問題があります:setは再び、総額... setを呼ぶであろう、自分自身を設定します。それはLevStadで再帰しています。

ie。あなたはLevStadを取得し、それはプロパティLevStadを取得しようとするプロパティLevStadを取得しようとします。そしてコールスタックがオーバーフローするまで続きます。

代わりにフィールドを設定してください(C#では大文字と小文字が区別されます)。

public string LevStad 
{ 
    get { return levStad; } 
    set { levStad = value; } 
} 

BoLandのセットでも同様の問題が発生します。

public string BoLand 
{ 
    get { return boLand; } 
    set { BoLand = value; } 
} 
+0

これは実際には別の同様のエラーです。 1つのOPの質問についてはLevStad –

+0

@RuneFS:うん、自分自身を修正しました。 – pdr

関連する問題