2013-05-04 147 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