我遇到了 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 变量不能用于维护调用之间的状态,因为它是一个实例变量。
您最好让您的服务无状态。但是,对于这种情况,您应该将购物车存储到数据库中。这样,购物车就不会在系统故障时丢失。
