我正在使用 SOAP header ,并且我需要从数据库对其进行身份验证。因此,我尝试创建一个类并使用一种方法,当我们传递用户名和密码时,它将返回它是否存在于数据库中。
----- 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 抛出到对象的实例。我已经为应用程序中的方法设置了用户名、密码和 header 值。但它没有命中“ValidateUser”方法。
有什么方法可以实现这一目标吗?
最佳答案
只要构造函数是静态的,您就可以在构造函数中保留连接对象实例化。即
public static UsersAuth()
{
con = new OracleConnection(WebConfigurationManager.ConnectionStrings["conString"].ToString());
}
这样做的优点是只创建一个连接,而不是为每个方法调用创建一个新连接。您需要考虑是否需要重用连接,如果需要,是否以及何时应该关闭连接。
关于c# - SOAP header 身份验证不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11644812/