2012-07-25 220 views
2

即时通讯使用SOAP标题,我需要从数据库进行身份验证。所以,我试着创建一个类,并有一个方法,当我们传递用户名和密码时,它将返回它是否在数据库中。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到对象的实例。我已经为应用程序中的方法设置了用户名,passsword和Headervalue。但它没有击中“ValidateUser”方法。

有什么办法可以实现这个目标?

回答

2

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

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

这将具有仅创建一个连接并且不为每个方法调用创建新连接的优点。您需要考虑是否需要连接重用,如果是,则应该关闭连接。

2

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

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