2012-12-04 44 views
0

我這是在Visual Studio中開發了以下簡單的WCF庫2008
運行時調用該WCF服務我得到以下情形假值WCFTestClinet/JavaScript的(使用SOAP):
1. GetNumber - >輸出:「你的號碼是0」
2. SetNumber - > No output
3. GetNumber - > output:「你的號碼是0」而不是輸出:「你的號碼是8」!
任何人都可以解釋爲什麼會發生這種情況,我該如何解決它?
感謝爲什麼WCF服務每個請求返回一個錯誤的值?

public class Service1 : IService1 
    { 
     private int Number; 

     public string GetData(int value) 
     { 
      return string.Format("You entered: {0}", value); 
     } 

     public CompositeType GetDataUsingDataContract(CompositeType composite) 
     { 
      if (composite.BoolValue) 
      { 
       composite.StringValue += "Suffix"; 
      } 
      return composite; 
     } 

     public string GetNumber() 
     { 
      return string.Format("Your number is : {0}", Number); 
     } 

     public void SetNumber() 
     { 
      Number = 8; 
     } 
    } 
+0

到服務的每個調用創建因此號碼總是重新初始化服務1的新實例。一個'快速'的解決方案將標記爲靜態數字... – Eric

回答

5

這是所有關於instances。您的服務的一個實例將默認實例化爲per session;但根據配置(for example using the BasicHttpBinding),服務可能會在每個呼叫實例化(和/或根本不支持會話)。

+0

感謝這篇文章是非常有益的! – liorafar

+0

如何在不使用靜態成員的情況下在會話之間共享內存?如果我有靜態成員是不是在不同的WCF客戶端之間共享,還是僅在客戶端會話之間共享? – liorafar

+0

@liorafar你通常不會,但這完全取決於情況。請記住WCF服務通常是無狀態的,不知道彼此的存在。您可以嘗試查看SQL Server等RDBMS來存儲要共享的數據。如果你能夠準確解釋你想要做的事情,你可以開一個新的問題,但不是沒有顯示一些研究工作。 – CodeCaster

0

這是在同一個實例嗎?因爲Number始終設置爲0,否則

1

可能是因爲您已將WCF服務配置爲每次調用而不是每個會話。

大答案告訴區別:https://stackoverflow.com/a/2542991/70386

+0

我測試後,我看到它只適用於InstanceContextMode.Single而不是InstanceContextMode.PerSession,但是我需要使用perSession。爲什麼它不共享同一個wcf服務的內存?如何在不使用靜態成員的情況下在會話之間共享內存?如果我有靜態成員是不是在不同的WCF客戶端之間共享,還是僅在客戶端會話之間共享?謝謝。 – liorafar

+0

創建一個新問題。 – jgauffin

0

我沒有使用過的SOAP WCF,但在我的工作,我的理解是,每次調用服務時都會創建一個新實例。這意味着無論你在SetNumber上做了什麼,都不會有下面的GetNumber,因爲它是一個新的實例。

如果您願意,可以將該值設置爲靜態以保留通話之間的更改。

0

這是因爲默認情況下,WCF 3.5的實例模式是PerCall。這意味着對於WCF接收的每個呼叫,它都會創建一個新的服務類實例,執行呼叫,然後銷燬該實例。

如果您想擁有共同的價值觀,你可以配置你的服務是一個單身,像這樣:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class Service1 : IService1 
相關問題