2013-07-09 36 views
0

在我的Asp.Net Web服務中,我使用下面的2方法將現有客戶端的狀態更改爲名爲ClientStatus的全局列表oblocation。這個全局列表從多個客戶端修改,但以安全的方式(鎖定)。對象引用未設置爲ASP.Net中對象的實例webservice

private static List<ActiveClient> ClientStatus = new List<ActiveClient>(); 
public static void SetClinetStatus(string ClientID, int clinetstatus) 
{ 
    ActiveClient activeClient=null; 
    try 
    { 
      activeClient = GetClient(ClientID); 
      if (activeClient != null) 
      { 
       activeClient.statuschanged = true; 
       activeClient.status = clinetstatus; 
      } 
    } 
    catch (Exception ex) 
    { 
     WebserviceLog.Debug(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType + "::" + System.Reflection.MethodBase.GetCurrentMethod().ToString() + ":" + ex.Message); 
    } 

} 

public static ActiveClient GetClient(string clientID) 
{ 
    ActiveClient activeClient = null; 
    try 
    { 
     lock (ClientStatus) 
     { 
      activeClient = ClientStatus.Find(c => c.clinetID == clientID); 
     } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    return activeClient; 
} 

我用下面的代碼的值傳遞給SetClinetStatus(字符串客戶端ID,INT clinetstatus)方法

string errorData = Encoding.Default.GetString(data); 
string[] tokens = errorData.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries); 
if (tokens.Length == 2) 
    {       
    SessionVariables.SetClinetStatus(tokens[0],Convert.ToInt32(tokens[1])); 
    } 

但有時(每次不)我得到

對象未設置爲對象實例的引用

形式

activeClient = GetClient(ClientID); 

我不明白爲什麼它正在發生,並沒有看到任何問題都有。

有沒有人看到有任何問題負責這種異常。

編輯

在全局列表中,我只添加客戶通過以下方法,在這裏clientID的將來自直接web服務方法。並在另一端(從客戶端ID來的地方)我添加了一個檢查,以不清空或清空clientID。

public static void AddClient(string clientID) 
     { 
      try 
      { 
       lock (ClientStatus) 
       { 
        ClientStatus.Add(new ActiveClient { clinetID = clientID }); 
       } 

      } 
      catch (Exception ex) 
      { 
       WebserviceLog.Debug(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType + "::" + System.Reflection.MethodBase.GetCurrentMethod().ToString() + ":" + ex.Message); 
      } 

     } 

ActiveClient類結構是

public class ActiveClient 
    { 
     public ActiveClient() 
     { 
      clinetID = string.Empty; 
      status = 0; 
      statuschanged = false; 
     } 
     public string clinetID { get; set; } 
     public int status { get; set; } 
     public bool statuschanged { get; set; } 
    } 
+2

'罰球前;'是通常非常糟糕的做法,c改變爲'投擲;'。 – Andrei

+1

ClientStatus在何處/何時初始化? – Riv

+0

'ClientStatus'可能是這裏的問題,但是在你的代碼中沒有設置它的位置。 @Andrei只是補充一點,它也不是一個好主意,要麼趕上'Exception' ... – James

回答

0

嘗試

public static void SetClinetStatus(string ClientID, int clinetstatus) 
{ 
    ClientID = ClientID.Trim(); 

    // Cannot run unless there is a ClientID submitted 
    if(string.IsNullOrEmpty(ClientID)) 
    { 
     // Log handling of event 
     return; 
    } 

    ActiveClient activeClient=null; 
    try 
    { 
     activeClient = GetClient(ClientID); 
     if (activeClient != null) 
     { 
      activeClient.statuschanged = true; 
      activeClient.status = clinetstatus; 
     } 
    } 
    catch (Exception ex) 
    { 
     WebserviceLog.Debug(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType + "::" + System.Reflection.MethodBase.GetCurrentMethod().ToString() + ":" + ex.Message); 
    } 

} 

您還應該確保ClientID的是在ClientStatus

public static ActiveClient GetClient(string clientID) 
{ 
    // Cannot continue without a ClientStatus 
    if(ClientStatus == null) 
    { 
     return null; 
    } 

    ActiveClient activeClient = null; 
    try 
    { 
     lock (ClientStatus) 
     { 
      // Test if there are any matching elements 
      if(ClientStatus.Any(c => c.clinetID == clientID)) 
      { 
       activeClient = ClientStatus.Find(c => c.clinetID != null && c.clinetID == clientID); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 

    // This will return null if there are no matching elements 
    return activeClient; 
} 
+0

但我看到ClientID不是空或空,而這種異常發生。因爲我設置了檢查日誌。 @Eric赫利茨 – Rezoan

+0

我用下面的代碼設置ClientID的 串[]令牌= errorData.Split前(新的字符串[] { 「:」},StringSplitOptions.RemoveEmptyEntries); 如果(tokens.Length == 2){ SessionVariables.SetClinetStatus(令牌[0],Convert.ToInt32(令牌[1])); } – Rezoan

+0

也許ClientID需要修剪?,添加ClientID = ClientID.Trim(); –

相關問題