2011-12-23 43 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%。 – 2011-12-23 20:36:49

回答

6

这是大写字母。它应该返回变量:

get { return levStad; }

眼下,它的返回自身,这就要求get,返回本身...堆栈溢出。


您还会遇到问题BoLand; set将设置本身,它会调用set ...再次,资本化:

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

还有就是你的问题。它正在LevStad上递归。

即。你得到了LevStad,它试图获得LevStad属性,它试图获得属性LevStad。所以它一直持续到调用堆栈溢出。

只是让它设置字段,而不是(C#区分大小写)。

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

您将在BoLand集上出现类似的问题。

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

这实际上是另一个类似的错误。 OP询问的一个问题是LevStad – 2011-12-23 20:39:18

+0

@RuneFS:是的,纠正了我自己。 – pdr 2011-12-23 20:43:10

相关问题