各位高手,我做了个web service,包含两个方法,比如
[WebMethod]
public string GeneratePwd() //产生一个口令[WebMethod]
public string GetPwd() //获取口令同时这个web service 类还一个字段如下
private string dynamicPwd = "";测试过程如下:我先调用GeneratePwd()这个方法,产生一个口令,同时在这个方法中,我把 dynamicPwd赋值为刚才产生的那个口令,然后我调用GetPwd()这个方法,获取刚才产生的口令,为什么每次都为空那?
可是实际是可以产生的阿?我现在对web methord 有个疑问,难道每个方法直接都是独立的,互不影响,为什么这个方法中设置了这个变量的值,那个方法中调用,却得不到阿 ?

解决方案 »

  1.   

    还是把代码贴出来,比较好的,代码如下:[WebService(Namespace = "http://lhf8.vicp.net/Server")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class Service : System.Web.Services.WebService
    {
        
        private static string dynamicPwd;
     
        public Service () {        dynamicPwd = "";
        }
        [WebMethod]
        public string GeneratePwd()
        {
            dynamicPwd = pwd();   //pwd()是一个密码产生器
        }
     
        [WebMethod]
        public string getPwd()
        {
            return dynamicPwd;
        }
    }如上代码,调试时,先产生,后获取,为何获取不到阿?
    请教高手,如果要保存某个变量的值,该如何做啊
      

  2.   

    你将private string dynamicPwd = ""; 改成 private const string dynamicPwd = ""; 
    试试。
      

  3.   

    回复bwguang(bwguang) 该成常量就不能改了哈,
      

  4.   

    using System;
    using System.Web;
    using System.Web.Services;
    using System.Web.Services.Protocols;[WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class Service : System.Web.Services.WebService
    {
        public Service () {        //如果使用设计的组件,请取消注释以下行 
            //InitializeComponent(); 
            dynamicPwd = "";
        }
        private static string dynamicPwd;    [WebMethod]
        public string HelloWorld() {
            return "Hello World";
        }    public void GeneratePwd()
        {
            dynamicPwd = "pass word test";   //pwd()是一个密码产生器
        }    [WebMethod]
        public string getPwd()
        {
            this.GeneratePwd();
            return dynamicPwd;
        }    
    }这样可以吗?
      

  5.   

    回复楼上的,产生和获取当然可以写在一个方法中,直接产生返回就可以了,可是我本来的想法是,产生口令后,通过手机端信的方式发给客户,然后客户在传给web service ,如果web service 受到的和产生的一致,当然就通了,可是当我传过去以后,每次都是发现产生的为空,居然没有?我在这里提问时,把问题简单化了,迷惑大家了,不好意思,我真真的想法如上!
      

  6.   

    那要想这样,密码是应该保存的,
    每次都是发现产生的为空,居然没有?
    -----------------
    可以跟踪一下,webservice添加web  引用后可以象本地一样的调试的
      

  7.   

    调用代码如下
    namespace SecureClient
    {
        public partial class secureClientForm : Form
        {
            public secureClientForm()
            {
                InitializeComponent();
            }        private void sendButton_Click(object sender, EventArgs e)
            {
                DynamicPwd.Service ws = new SecureClient.DynamicPwd.Service();
                string loginStr = "";
                loginStr = ws.GeneratePwd();
                if (loginStr != "")
                {
                    
                    string authenticateStr = ws.GetPwd();
                    if (authenticateStr.Equals(loginStr))
                        MessageBox.Show("验证成功");
                    else
                        MessageBox.Show("验证失败");
                }
                else
                    MessageBox.Show("获取口令失败", "提示");
     
            }
        }
    }
      

  8.   

    哦,真的这样的,那web service 每个web methord提供一个服务,那服务之间没有联系,如何通信那?
      

  9.   

    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();   
      ...
      

  10.   

    对了 ExamSrv 是个什么类型, win form 程序中可以使用吗 ?
      

  11.   

    使用cookie session 后,在服务器端本地测试,成功了,可是在我的客户端测试就不行了,当然我的客户端win form程序,不是asp.net程序, 我查看了,win form程序好像不能使用cookie阿, 那怎么办啊,
      

  12.   

    服务是没有状态的。
    lz可以换个思路,public string GeneratePwd()和public string GetPwd() 都用一个标识符作为参数,string、guid都行,比如一个guid就对应一个客户端,GeneratePwd(Guid guid)和GetPwd(Guid guid)这样。
    然后再加个缓存,比如加一个static的Hashtable:
     private static Hashtable hashtable = new Hashtable();
     
        public Service () {    }
        [WebMethod]
        public string GeneratePwd(Guid guid)
        {
            hashtable[guid] = pwd();   //pwd()是一个密码产生器
        }
     
        [WebMethod]
        public string getPwd(Guid guid)
        {
            return (string)hashtable[guid];
        }
      

  13.   

    多谢楼上的,可以了,高手阿,以后要多来csdn阿,答疑解惑阿 ,谢谢了
      

  14.   

    http是无状态的,用户每访问一次,对于webservice来说都是新的。
    lz可以用internet时间做种子,md5加密,产生cookie,并与密码产生器在数据库中对应起来做验证机制
      

  15.   

    谢谢大家提供这样各种各样的方法,问题已经用hashtable解决了,好了,谢谢大家的解答,好了,该给分了,