2013-09-10 38 views
0

我的Web服務被稱爲ASMX的WebMethod調用不保留變量值

public class Service : System.Web.Services.WebService 
{ 

    public Service() { 

     //Uncomment the following line if using designed components 
     //InitializeComponent(); 
    } 

    private string password; 

    [WebMethod] 
    public void SetPassword(string pPassword) 
    { 
     password = pPassword; 
    } 

    private bool ValidPassword() 
    { 
     return (password == ConfigurationManager.AppSettings["Token"].ToString()); 
    } 

    [WebMethod] 
    public DataSet GetAccountInfo(string account) 
    { 
      ValidPassword(); 
      //logic here 
    } 

的網頁做

 Dim mySvc As New RNX.Service 

     mySvc.SetPassword("passwordhere") 

     Dim dsAcctInfo As DataSet = mySvc.GetAccountInfo(strAcct) 

兩種方法都執行就好了電話... SetPassword完成,然後使用同一個Web服務對象,調用者然後運行GetAccountInfo,它檢查它是否是ValidPassword()。

但是,在這個時候,變量再次爲空......如在,不保留該值。

+0

ASMX是一種過時的技術,並且不應該被用於新的開發。 WCF應該用於Web服務客戶端和服務器的所有新開發。一個暗示:微軟已經在MSDN上退役了[ASMX Forum](http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/threads)。 –

回答

2

您應該啓用會話爲[WebMethod(EnableSession=true)]並將密碼存儲在Session

[WebMethod(EnableSession=true)] 
public void SetPassword(string pPassword) 
{ 
    Session["password"] = pPassword; 
} 
2

每次調用服務時都會創建一個新的實例。服務的目的不是維護國家。他們應該是無國籍的。因此,第一次使用mySvc.SetPassword調用它時,會實例化類Service的新實例並設置密碼。什麼都沒有返回,然後服務實例被銷燬。然後再次使用mySvc.GetAccountInfo(strAcct)調用它,實例化Service類的新實例並且未設置密碼,以便ValidPassword()返回false。

如果你想保持狀態,您可以使用會話來存儲密碼(雖然這似乎是一個壞主意!)