我目前正在开发一个c#/ php / soap项目。主应用程序是一个控制台应用程序,php是一个管理控制台应用程序的Web界面。
在控制台应用程序中,有一个静态List数组,当php web界面发布soap调用它在控制台应用程序中调用一个函数来更新数据库时,它应该更新List数组。但是,这是有效的,因为它正在设置值,但是控制台应用程序看不到它已被更改。
看起来好像只在soap服务中使用静态List数组,并且实际上并没有访问控制台应用程序正在查看的静态数组。
如何更新此静态变量,以便控制台应用程序可以看到它已被修改。
感谢您提供的任何帮助。
更新 以下是我正在使用的代码。
以下是公共网络方法
[WebMethod]
public List<SoapHandler.SoapStatusDetails> RetryEmailQueue(int emailId)
{
SoapHandler soapHandler = new SoapHandler();
List<SoapHandler.SoapStatusDetails> status = soapHandler.addEmailBackToQueue(emailId);
return status;
}
下面是在上面的代码中调用的SoapHandler方法,该类在Console App中。
public List<SoapStatusDetails> addEmailBackToQueue(int emailId)
{
List<SoapStatusDetails> status = new List<SoapStatusDetails>();
try
{
string query = "UPDATE emailqueue SET Status=@status, RetryCount=@count WHERE id=@id";
using (ConnectDb db = new ConnectDb(appSettings))
{
using (MySqlCommand cmd = new MySqlCommand(query, db.conn))
{
cmd.Parameters.AddWithValue("@status", ManageEmail.EmailStatus.Queued.ToString());
cmd.Parameters.AddWithValue("@count", 0);
cmd.Parameters.AddWithValue("@id", emailId);
cmd.ExecuteNonQuery();
ManageEmail.queuedEmailIds.Add(emailId);
status.Add(new SoapStatusDetails()
{
status = SoapStatus.Success.ToString(),
errorMessage = ""
});
}
}
}
catch (MySqlException ex)
{
string error = string.Format("Unable to put email back into queue for email: id {0}. MySQL Error: {1}",
emailId, ex.Message);
library.logging(classDetails + MethodInfo.GetCurrentMethod().Name, error);
library.setAlarm(error, "Critical", MethodInfo.GetCurrentMethod().Name);
status.Add(new SoapStatusDetails()
{
status = SoapStatus.Failure.ToString(),
errorMessage = ex.Message
});
}
catch (Exception ex)
{
string error = string.Format("Unable to put email back into queue: id{0}. General Error: {1}",
emailId, ex.Message);
library.logging(classDetails + MethodInfo.GetCurrentMethod().Name, error);
library.setAlarm(error, "Critical", MethodInfo.GetCurrentMethod().Name);
status.Add(new SoapStatusDetails()
{
status = SoapStatus.Failure.ToString(),
errorMessage = ex.Message
});
}
return status;
}
ManageEmail.queuedEmailIds.Add(emailId);
这是静态变量,似乎被Soap服务改变了,但是控制台应用程序从未发现它已经发生了变化。
更新 我尝试使用单身但遇到了同样的问题,似乎做了同样的事情。
在ManageEmail类中,我添加了这个,
public List<int> queuedEmailIds = new List<int>();
public static ManageEmail instance;
private ManageEmail() { }
public static ManageEmail Instance
{
get
{
if (instance == null)
{
instance = new ManageEmail();
}
return instance;
}
}
当我访问列表数组时,我执行以下操作
ManageEmail.Instance.queuedEmailIds.Add(emailId);
然而,这些变化并没有任何区别。
答案 0 :(得分:1)
如果没有原始诊断,我认为你所拥有的是一个实例化问题,其中一个类的实例具有引用值而不是另一个类。
这可能是查看Singleton Pattern的好地方,因此您始终引用该类的相同实例。我意识到其中一个值是一个静态变量,但它是一个实例化变量(即列表)