2011-01-13 68 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