2

SOAP ヘッダーを使用しており、データベースから認証する必要があります。それで、私は1つのクラスを作成しようとしましたが、ユーザー名とパスワードを渡すと、DBにあるかどうかを返すメソッドが1つあります。

----- My Main Class ---
[WebMethod, SoapHeader("AuthenticateUser")]
public System.Xml.XmlElement CancelUSer(string _UserID, string _Remarks)
{

    if (UsersAuth.ValidateUser(AuthenticateUser.UserName, AuthenticateUser.Password) > 0)
    {
//METHODS

     }
 }

public class UserAuthenticateHeader : SoapHeader
{
public string UserName;
public string Password;

}

public class UsersAuth
{
static OracleConnection con;
public UsersAuth()
{
 con = new OracleConnection(WebConfigurationManager.ConnectionStrings["conString"].ToString());
}




public static int ValidateUser(string _UserName, string _Password)
{
    int Result = 0;
    using (OracleCommand cmd = new OracleCommand("SELECT COUNT(*) FROM USES WHERE UID=:UID AND PASSWORD=:PASSWORD", con)) {
        cmd.Parameters.AddWithValue(":UID", _UserName);
        cmd.Parameters.AddWithValue(":PASSWORD", _Password);
        con.Open();
        Result = Convert.ToInt32(cmd.ExecuteScalar());
        con.Close();
    }
    return Result;
}

}

さて、私のプログラムからこれを呼び出すと、ObjectReferenceNotSet がオブジェクトのインスタンスにスローされます。アプリケーションからメソッドのユーザー名、パスワード、ヘッダー値を設定しました。しかし、「 ValidateUser」メソッドにはヒットしません。

これを達成する方法はありますか?

4

2 に答える 2

2

コンストラクターが静的である限り、コンストラクターで接続オブジェクトのインスタンス化を保持できます。すなわち

public static UsersAuth()
{
    con = new OracleConnection(WebConfigurationManager.ConnectionStrings["conString"].ToString());
}

これには、1 つの接続のみを作成し、メソッド呼び出しごとに新しい接続を作成しないという利点があります。接続の再利用が必要かどうか、必要な場合はいつ接続を閉じる必要があるかを検討する必要があります。

于 2012-07-25T10:32:11.160 に答える
2

私はそれを解決しました。メソッドは静的であるため、OracleConnection を呼び出していませんでした。OracleConnection 宣言を Method に変更しました。そして今、その作業。

メソッドは静的であるため、クラスのオブジェクトを作成する必要はありません。オブジェクトがなければ、コンストラクターは呼び出されません。それが問題でした。

于 2012-07-25T09:55:03.220 に答える