2011-01-13 37 views
2

我在我的解決方案中有一個Web服務項目和一個WPF項目(作爲客戶端)。Web方法執行後,Web服務類字段爲空?

代表Web服務的類是相當簡單的,看起來像這樣:

public class CardsGameService : System.Web.Services.WebService 
{ 
    private Card magicCard; 

    // Acts as a getter for magicCard field 
    [WebMethod] 
    public Card GetMagicCard() 
    { 
     return magicCard; 
    } 

    // Creates some random cards and sets the magicCard field 
    [WebMethod] 
    public Card[] GetNewCardSet() 
    { 
     Card[] cardSet = new Card[4]; 

     for (int i = 0; i < 4; i++) 
     { 
      cardSet[i] = GetRandomCard(); 
     } 

     Random random = new Random(); 
     int index = random.Next(0, 3); 

     // This field does get its value and 
     // is not null when this method is executed 
     magicCard = cardSet[index]; 

     return cardSet; 
    } 
} 

在我的客戶WPF代碼隱藏類,我實例化CardsGameServiceSoapClient service,並調用返回的套牌的GetNewCardSet() Web方法。

這裏的問題:
如果我要調用的Web方法GetMagicCard()以後,它總是返回null爲什麼?我只實例化CardsGameServiceSoapClient service一次,此對象爲alive只要我運行我的客戶端應用程序。

+0

更好的計劃:不要在Web服務中使用狀態。最佳計劃:如果可以,請升級到WCF。 – 2011-01-13 03:21:43

回答

2

因爲WebService實例是基於每個呼叫創建和丟棄的。如果您想在多個Web服務調用之間共享狀態,請使用靜態字段。但要小心,在處理任何其他多線程代碼時,您需要擔心同樣的問題。兩個調用可能同時進行,因此您需要在適當的時候使用鎖。

另外值得一提的是,IIS可以隨時以任何理由終止您的應用程序域,因此您不應該依賴該字段無限期地掛起的事實。如果你需要它堅持下來,然後使用數據庫或其他永久存儲。

+0

謝謝你的回答。 – Boris 2011-01-13 01:28:54

1

問題在於,雖然您的代理客戶端對象(CardsGameServiceSoapClient)在兩次調用之間處於活動狀態,但對您的服務的每次調用都是全新的請求,並且服務器對象將在每個請求中實例化....您需要爲每個Web方法創建和初始化對象(可能是在構造函數中初始化它?)

+0

謝謝你的回答。我現在很清楚。 – Boris 2011-01-13 01:28:34