我遇到了ASP.NET的会话变量和Web服务代理对象的问题.我可以访问我在实际.asmx文件中创建的任何数据,但添加数据"通过"会话变量导致绝对没有任何事情发生.
我的目标很简单,我想创建一个"几乎购物车".客户在此文本框中输入标题,然后将其发送到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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
(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");
}
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
工作原理:我在ASMX中输入的默认测试值,它们可以很好地加载到文本框中.
简而言之,我可以在会话变量中使用Web服务代理对象吗?如果没有,那么"分享"这个对象的最佳方式是什么?
另外:我正在使用VS2005.
谢谢你的帮助!
每个Web服务调用都发生在Web服务类的不同实例上.您的reservations变量不能用于维护调用之间的状态,因为它是一个实例变量.
你最好让你的服务无国籍.但是,对于这种情况,您应该将购物车存储到数据库中.这样,购物车不会因系统故障而丢失.