对象引用未设置为ASP.Net Web服务中对象的实例
本文关键字:服务 对象 实例 Web Net 设置 ASP 对象引用 | 更新日期: 2023-09-27 18:21:42
在我的Asp.Net web服务中,我使用下面的2种方法将现有客户端的状态从名为ClientStatus的全局列表对象中更改。此全局列表是从多个客户端修改的,但以安全的方式(锁定)。
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(string ClientID,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);
我不明白为什么会发生这种事,也看不出有什么问题。
有人认为有什么问题导致了这种例外吗。
编辑
在全局列表中,我只通过下面的方法添加客户端,这里的客户端ID将来自直接webservice方法。在另一端(客户端ID的来源),我添加了一个检查,以确保客户端ID不为null或为空。
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);
}
}
CCD_ 1类结构为
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; }
}
尝试
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);
}
}
您还应该确保客户端ID在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;
}