我的解决方案中有一个Web服务项目和一个WPF项目(作为客户端)。
表示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方法。
问题在于:
如果我想稍后调用网络方法GetMagicCard()
,它始终会返回null
。 为什么?我只运行一次CardsGameServiceSoapClient service
,只要我运行客户端应用程序,此对象就是 alive 。
答案 0 :(得分:2)
因为WebService实例是基于每个呼叫创建和丢弃的。如果要在多个Web服务调用之间共享状态,请使用静态字段。但请注意,在处理任何其他多线程代码时,您需要担心同样的问题。两个调用可能同时进行,因此您需要在适当的时候使用锁。
另外值得一提的是,IIS可以并且将随时以任何理由终止您的应用程序域,因此您不应该依赖于该字段将无限期地挂起的事实。如果您需要它来持久化,那么请使用数据库或其他持久存储。
答案 1 :(得分:1)
问题在于,虽然您的代理客户端对象(CardsGameServiceSoapClient)在两次调用之间处于活动状态,但每次调用您的服务都是一个全新的请求,并且服务器对象在每个请求上实例化....您需要为每个Web方法创建和初始化您的对象(可能在构造函数中初始化它?)