Skip to main content
 首页 » 编程设计

c#之session 变量、Web 服务、ASP.NET 和 C#

2024年02月03日29duanxz

我遇到了 ASP.NET 的 session 变量和 Web 服务代理对象的问题。我可以访问我在实际 .asmx 文件中创建的任何数据,但是“通过” session 变量添加数据不会导致任何事情发生。

我的目标很简单,我想创建一个“Almost Shopping cart”。客户在此文本框中输入标题,然后将其发送到 Web 服务。 Web 服务在母版页中调用,它获取一个包含客户请求的“标题”的数组列表。

数据在一个下拉框中可见,还有一个标签存储了所有项目的总成本(我目前不担心成本)。

问题是,每当我调用网络服务方法时,绝对没有任何反应。

有问题的代码:

篮子.asmx

public class basket  : System.Web.Services.WebService { 
 
ArrayList reservations = new ArrayList(); 
double total = 0; 
 
public basket() 
{ 
    reservations.Add("Extreme Test Data"); 
    reservations.Add("Moar Test Data"); 
} 
 
[WebMethod] 
public string[] getReservations() 
{ 
    //This may be part of the issue, still not sure. 
 
    return (string[])reservations.ToArray(typeof( string)); 
} 
[WebMethod] 
public string toString() 
{ 
    return reservations[reservations.Count - 1].ToString(); 
} 
 
 
[WebMethod] 
public double getTotal() 
{ 
    return total; 
} 
 
[WebMethod] 
public void addCost(double price) 
{ 
    total = total + price; 
} 
 
[WebMethod] 
 
public void addReservation(String title) 
{ 
 
    reservations.Add(title); 
 
} 
[WebMethod] 
public void removeReservation(string title) 
{ 
} 
[WebMethod] 
public int getLength() 
{ 
    return reservations.Count; 
} 

Global.asax

    void Session_Start(object sender, EventArgs e)  
{ 
    // Code that runs when a new session is started 
    localhost.basket proxy = new localhost.basket(); 
    Session["reservations"] = proxy; 
} 

(global.asax 中的其他所有内容都是默认值)

主页

这是母版页中唯一相关的代码,它通过 session 变量调用网络服务。

    protected void Page_Load(object sender, EventArgs e) 
{ 
 
    localhost.basket proxy = (localhost.basket)Session["reservations"]; 
 
        lblTotal.Text = proxy.getTotal().ToString("c"); 
        string[] res = proxy.getReservations(); 
        ddReservations.DataSource = res; 
        ddReservations.DataBind(); 
        proxy.addReservation("Half Life 2"); 
} 

Reservations.aspx

此页面将实际的"new"数据提交给网络服务。我已经删掉了很多(这是一个小组项目,所以有很多代码不是我写的)。

protected void Page_Load(object sender, EventArgs e) 
{ 
    proxy = (localhost.basket)Session["reservations"]; 
    Response.Write(proxy.toString() + "Count: " + proxy.getLength()); 
 
} 
 
  protected void cmdSubmit_Click(object sender, EventArgs e) 
{ 
    proxy.addReservation(txtGameTitle.Text);         
    proxy.addCost(39.99); 
} 

什么有效:我在 ASMX 中输入的默认测试值,它们可以很好地加载到文本框中。

简而言之,我可以在 session 变量中使用 Web 服务代理对象吗?如果不是,“共享”此对象的最佳方式是什么?

另外:我正在使用 VS2005。

感谢您的帮助!

请您参考如下方法:

每个网络服务调用都发生在网络服务类的不同实例上。您的 reservations 变量不能用于维护调用之间的状态,因为它是一个实例变量。

您最好让您的服务无状态。但是,对于这种情况,您应该将购物车存储到数据库中。这样,购物车就不会在系统故障时丢失。