WebService中不同的Web方法怎样共享变量?

andot 2002-05-15 05:10:07
举个简单的例子:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;

namespace example
{
public class Exam : System.Web.Services.WebService
{
public int a;

[WebMethod]
public int seta()
{
a = 100;
return a;
}

[WebMethod]
public int geta()
{
return a;
}
}
}
上面这个程序中变量a的值很奇怪,在调用方法seta时,返回值是100,之后再调用方法geta,返回值居然是0。
我想问一下,怎样才能让a保持改变以后的值呢?谢谢!
...全文
102 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
andot 2002-05-16
  • 打赏
  • 举报
回复
分全都给你了!谢谢老大!
andot 2002-05-16
  • 打赏
  • 举报
回复
啊,是啊,我怎么没想到呢!好了,散分!
qqchen79 2002-05-15
  • 打赏
  • 举报
回复
不是说了每次请求有一个实例来处理吗?
请求1(seta) -> object1构造 -> a = 0 -> seta() -> a = 100;
请求2(geta) -> object2构造 -> a = 0 -> geta() -> a = 0;
qqchen79 2002-05-15
  • 打赏
  • 举报
回复
if (Session["a"] = null) {
Session["a"] = 0;
}
andot 2002-05-15
  • 打赏
  • 举报
回复
啊,原来是这样。还有一个问题。就是如果我写一个构造函数,在其中初始化变量Session["a"]=0以后,那么geta方法又总是返回0了,这是为什么呢?

public class Exam : System.Web.Services.WebService
{
public Exam()
{
Session["a"] = 0;
}

[WebMethod(EnableSession=true)]
public int seta()
{
Session["a"] = 100;
return (int)Session["a"];
}

[WebMethod(EnableSession=true)]
public int geta()
{
return (int)Session["a"];
}
}

上面是测试的程序,而且Session["a"]改为Application["a"]以后还是一样,为什么呢?
qqchen79 2002-05-15
  • 打赏
  • 举报
回复
WebService缺省情况下是无状态的,也就是说每个独立的请求系统都会重新构造一个WebService类得实例来处理。所以上面a的值无法保留。

可以手工打开session的支持:
[WebMethod(EnableSession=true)]
public int seta()
{
Session["a"] = 100;
}

[WebMethod(EnableSession=true)]
public int geta()
{
return Session["a"];
}

同时,客户端程序也要相应的修改以支持Cookie:
ExamSrv em = new ExamSrv();
em.CookieContainer = new System.Net.CookieContainer();
em.seta();
int k = em.geta();
...
andot 2002-05-15
  • 打赏
  • 举报
回复
那样的话,岂不是无法初始化Session["a"]了吗?难道必须要在Global.asax中的Application_Start中初始化吗?还有没有别的办法啊?

12,165

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧