从Soap Request中的Console应用程序修改列表数组

时间:2012-07-09 20:18:43

标签: c# php soap

我目前正在开发一个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);
然而,这些变化并没有任何区别。

1 个答案:

答案 0 :(得分:1)

如果没有原始诊断,我认为你所拥有的是一个实例化问题,其中一个类的实例具有引用值而不是另一个类。

这可能是查看Singleton Pattern的好地方,因此您始终引用该类的相同实例。我意识到其中一个值是一个静态变量,但它是一个实例化变量(即列表)