一个类
class Class1
{
public string name;
                  
public Class1(string n)
{
//
// TODO: 在此处添加构造函数逻辑
//
name=n;
}
}
Services
public class Service1 : System.Web.Services.WebService
{
                  public Class1 c;
public Service1()
{
//CODEGEN: 该调用是 ASP.NET Web 服务设计器所必需的
InitializeComponent();
} [WebMethod] public void Sett()
{
this.c=new Class1("test");
} [WebMethod] public string Gett()
{
return c.name;
}
}
客户端在调用Sett()后再调用Gett()时候c就是null,
如果需要实现这样的功能 应该怎么做?

解决方案 »

  1.   

    to 客户端在调用Sett()后再调用Gett()时候c就是null,
    如果需要实现这样的功能 应该怎么做?webservice的私有成员,对于客户端是没有用的,即在两次调用过程中,服务器端会分别创建service对象,所以要使两此调用能访问同一个对象,就需要使用session,首先webmethod需要改动,然后客户端要用cookie来保持同两次操作在同一个session中。
    例如:
    //webservice
    [WebMethod(true)]
    public void Sett()
    {
       Class1 c=new Class1("test");
       Session["MyTest"] = c;
    }[WebMethod(true)]
    public string Gett()
    {
       Class1 c = Session["MyTest"] as Class1;
       if( c != null )
          return c.name;
       else
          return null;
    }
      

  2.   

    Thanks U at Firstto 然后客户端要用cookie来保持同两次操作在同一个session中。cookie保持SessionId 然后下次执行的时候再根据SessionId来取得相应Session 转化后处理么?
    这样的速度应该比直接把name当参数传效率还低,
      

  3.   

    to cookie保持SessionId 然后下次执行的时候再根据SessionId来取得相应Session 转化后处理么?
    这样的速度应该比直接把name当参数传效率还低,这是双方面的,
    首先如果使用Session,那么效率会要损失一些,一方面服务器要开启session,并在session中存入数据,增加服务器端的资源开销,其次就是你所说的,客户端需要建立cookie来保证统一前后操作在同一session中。就与这两方面来说,前者需要注意,因为不同的客户端调用都会在session中存放,那么session中存入的数据量是比较多的,但是session资源回收,却不是想象中那样,使用完了就立刻回收,所以如何去清除session中的数据不是个简单的问题。至于后者的影响是微乎其微的。至于你所说的,用name当参数来代替,在某些环境是个不错的选择,但是这样做有些疑问,一个是这个参数是否类的属性值,即无法验证其的有效性;二是如果用到的数据不光是name一个属性的时候,要么增加参数来传递,要么用当前类作为参数来传递,这时候就需要把类对象进行序列化。这样做的缺点在于,增加了客户端与服务器端的传输数据量(这部分数据的增加,对调用效率的影响是不容忽视的)。那么具体用哪种方法,外人无法给出一个最优方法。
    这里我提一点,以前我写的web service,用的是第一种。
      

  4.   

    由于我目前的需求传输的参数就3个 字符串 而且长度加起来才50不到 所以还是当参数传把类/结构(非基本数据类型)当参数,需要序列转化,使用Session也要涉及到拆箱/装箱问题(撇开其余的资源损耗不说),不过多谢 提供了一种思想.