【问题标题】:ASMX WebMethod calls not retaining variable valuesASMX WebMethod 调用不保留变量值
【发布时间】:2013-09-10 20:31:51
【问题描述】:

我的网络服务被调用

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()。

但是,此时变量又为null了……如中,不保留值。

【问题讨论】:

  • ASMX 是一项遗留技术,不应用于新开发。 WCF 应该用于 Web 服务客户端和服务器的所有新开发。一个提示:微软已经在 MSDN 上停用了ASMX Forum

标签: c# .net web-services asmx


【解决方案1】:

您应该以[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。

    如果你想保持状态,你可以使用 Session 来存储密码(虽然这似乎是个坏主意!)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多