2

我使用的是 SOAP 标头,我需要从数据库中对其进行身份验证。因此,我尝试创建一个类并使用一种方法,当我们传递用户名和密码时,它将返回数据库中是否存在。

----- 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 扔到一个对象的实例中。我已经为应用程序中的方法设置了用户名、密码和 Headervalue。但它没有达到“ ValidateUser ”方法。

有什么方法可以实现这一目标吗?

4

2 回答 2

2

我解决了。由于该方法是静态的,因此它没有调用 OracleConnection。我将 OracleConnection 声明更改为 Method。现在它的工作。

由于方法是静态的,我们不需要创建类的对象。没有对象,构造函数将不会被调用。这就是问题所在。

于 2012-07-25T09:55:03.220 回答
2

只要构造函数是静态的,您就可以将连接对象实例化保留在构造函数中。IE

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

这样做的好处是只创建一个连接,而不是为每个方法调用创建一个新连接。您需要考虑是否需要重用连接,如果需要,是否以及何时关闭连接。

于 2012-07-25T10:32:11.160 回答