2012-07-25 217 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,構造函數將不會被調用。這是問題。