0

私は現在ac#/ php/soapプロジェクトに取り組んでいます。メインアプリはコンソールアプリであり、phpはコンソールアプリを管理するためのWebインターフェイスです。

コンソールアプリ内には静的なリスト配列があり、php Webインターフェイスがsoapメッセージを送信すると、コンソールアプリ内の関数を呼び出してデータベースを更新し、リスト配列を更新することになっています。ただし、値を設定しているため、これは機能していますが、コンソールアプリは値が変更されたことを認識しません。

静的リスト配列はsoapサービス内からのみ使用されているように見え、コンソールアプリが監視している静的配列に実際にはアクセスしていません。

この静的変数を更新して、コンソールアプリケーションが変更されたことを確認できるようにするにはどうすればよいですか。

あなたが提供できるどんな助けにも感謝します。

UPDATE 以下に要求されているのは、私が使用しているコードです。

以下はパブリックウェブメソッドです

[WebMethod]
public List<SoapHandler.SoapStatusDetails> RetryEmailQueue(int emailId)
{
    SoapHandler soapHandler = new SoapHandler();
    List<SoapHandler.SoapStatusDetails> status = soapHandler.addEmailBackToQueue(emailId); 

    return status;
}

以下は、上記のコードで呼び出されるSoapHandlerメソッドです。このクラスは、コンソールアプリ内にあります。

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 Serviceによって変更されたように見える静的変数ですが、コンソールアプリはこれが変更されたことを認識しません。

UPDATE シングルトンを使用してみましたが、同じ問題が発生しました。同じことをしているようです。

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);

ただし、これらの変更による違いはありません。

4

1 に答える 1

1

生の診断がなければ、クラスの1つのインスタンスが別のクラスよりも参照値を持っているというインスタンス化の問題だと思います。

これは、シングルトンパターンを確認するのに適した場所である可能性があるため、常にクラスの同じインスタンスを参照しています。値の1つが静的変数であることに気付きましたが、それはインスタンス化された変数(つまりリスト)です

于 2012-07-09T20:23:06.373 に答える