2013-05-04 101 views
0

我正在C#中使用WebServices进行项目。我想问你,我如何给客户端的一个变量赋予一个值给Web服务?如何给WebService中的变量赋值?

例如: 在Web服务,我有一个变量和两个方法,getVariable()setVariable(bool a);

bool var = false; 

[WebMethod] 
public void setVariable(bool a) 
{ 
var = a; 
} 

[WebMethod] 
public bool getVariable() 
{ 
return var; 
} 

这是怎么了我的web服务看起来(这很简单,因为我学习)。

我的客户: //在客户端,我添加了Web服务作为一个服务引用,并添加以下代码:

ServiceReference.ServiceSoapClient obj = new ServiceReference.ServiceSoapClient(); 


private void Form_Load(object sender, EventArgs e) 
{ 
    obj.setVariable(true); 
    label1.Text = obj.getVariable().ToString(); 
} 

当我打开我的表单中,label1.Text是不是“真正的平等“但带有”假“!这意味着它没有执行此代码:obj.setVariable(true); 我的教授在课堂上说WebService现在是“完整的......”(但我听不清楚),他说你必须找到一种方法使网络服务“完全...”

有人可以帮助我吗?

+2

他可能说有状态,而不是无国籍。 http://stackoverflow.com/questions/988819/stateful-webservice – flup 2013-05-04 18:51:37

+2

不是一个好方法,只是为了学习目的:尝试'static bool var = false;'并且看到区别 – I4V 2013-05-04 18:57:29

+1

这将是一个非常糟糕的方法,特别是对于学习的目的。 – 2013-05-04 18:58:04

回答

0

@ I4V - 感谢您对我的文章发表评论。

我刚刚在bool变量之前加了static并且它有效。

2

由于Web服务是无状态的,你不能做你想做的事情。

尽管您只有一个客户端实例,但每次调用都会创建一个服务器端实例。这意味着在第一次调用中,您将变量设置为一个对象,然后超出范围(因为它与该请求绑定)。当你进行第二次调用时,会创建一个新的服务实例,这个新实例显然不知道前一个实例。

如果你想做这样的事情,你需要保存状态。这可以通过各种方式来完成:

  • Application对象(HttpContext.Current.Application("myvar") = a
  • 保存的值保存在会话状态(你需要的属性添加到服务类,以使会话状态,那么你一样做与Application,但在文件
  • 访问HttpContext.Current.Session
  • 保存在数据库中
  • 保存它...
+1

如果您使用的是较新的.NET版本,您也可以使用WF服务,尽管这可归结为同样的事情 - 您需要创建一个工作流实例。然而,例如实例化和保存到数据库(持久化)几乎都是“开箱即用”的。 :) – Shaamaan 2013-05-04 19:08:44

3

默认情况下,Web服务是无状态的,这意味着它们不会在调用之间保留状态。因此,一次呼叫中设置的值将不可用于下次呼叫。

如果您需要有状态的服务,有几种方法可行。 this可能是最简单的。

听起来你正在为了学习目的而这样做,在这种情况下,我建议阅读为什么开发使用有状态服务不是一个好习惯。首先尝试this one