2009-12-08 66 views
1

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

我的目标很简单,我想创建一个“几乎购物车”。客户在此文本框中输入标题,并将其发送到Web服务。该Web服务在主页面中调用,它抓取一个完整的客户请求的“标题”的数组列表。

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

问题是,任何时候我打电话给Web服务方法,绝对没有任何反应。

中的代码问题:

Basket.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的一切是默认值)

主页面

这是主页面中唯一相关的代码,它通过会话变量调用Web服务。

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

此页面提交实际的 “新” 数据给Web服务。我剪掉了很多这样的东西(这是一个小组项目,所以我写了很多代码)。

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中输入的默认测试值,它们加载到文本框中。

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

另外:我正在使用VS2005。

感谢您的帮助!

回答

5

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

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

+0

同意。一个好的设计可以弥补这些问题。 –

+0

好的,谢谢,我们几乎已经通过数据库实现了它,所以它不会很难实现,谢谢! – Alpaca