2013-09-10 2 views
0

My Web Service называют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 заканчивается, а затем с помощью тот же объект веб-службы, тогда вызывающий объект запускает GetAccountInfo, который проверяет, является ли это ValidPassword().

Однако в это время переменная снова равна нулю ... как в, не сохраняя значение.

+0

ASMX является наследием технологии, и не должны быть использованы для разработки новых. WCF следует использовать для всех новых разработок клиентов и серверов веб-сервисов. Один из намеков: Microsoft отстранила [ASMX Forum] (http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/threads) в MSDN. –

ответ

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.

Если вы хотите сохранить состояние, вы можете использовать сессии для хранения пароля (хотя это, кажется, как плохая идея!)

Смежные вопросы