各位高手,我做了个web service,包含两个方法,比如
[WebMethod]
public string GeneratePwd() //产生一个口令[WebMethod]
public string GetPwd() //获取口令同时这个web service 类还一个字段如下
private string dynamicPwd = "";测试过程如下:我先调用GeneratePwd()这个方法,产生一个口令,同时在这个方法中,我把 dynamicPwd赋值为刚才产生的那个口令,然后我调用GetPwd()这个方法,获取刚才产生的口令,为什么每次都为空那?
可是实际是可以产生的阿?我现在对web methord 有个疑问,难道每个方法直接都是独立的,互不影响,为什么这个方法中设置了这个变量的值,那个方法中调用,却得不到阿 ?
[WebMethod]
public string GeneratePwd() //产生一个口令[WebMethod]
public string GetPwd() //获取口令同时这个web service 类还一个字段如下
private string dynamicPwd = "";测试过程如下:我先调用GeneratePwd()这个方法,产生一个口令,同时在这个方法中,我把 dynamicPwd赋值为刚才产生的那个口令,然后我调用GetPwd()这个方法,获取刚才产生的口令,为什么每次都为空那?
可是实际是可以产生的阿?我现在对web methord 有个疑问,难道每个方法直接都是独立的,互不影响,为什么这个方法中设置了这个变量的值,那个方法中调用,却得不到阿 ?
[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;
}
}如上代码,调试时,先产生,后获取,为何获取不到阿?
请教高手,如果要保存某个变量的值,该如何做啊
试试。
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;
}
}这样可以吗?
每次都是发现产生的为空,居然没有?
-----------------
可以跟踪一下,webservice添加web 引用后可以象本地一样的调试的
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("获取口令失败", "提示");
}
}
}
可以手工打开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();
...
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];
}
lz可以用internet时间做种子,md5加密,产生cookie,并与密码产生器在数据库中对应起来做验证机制