执行Web方法后,Web服务类字段为空?

时间:2011-01-13 01:11:00

标签: c# asmx

我的解决方案中有一个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

2 个答案:

答案 0 :(得分:2)

因为WebService实例是基于每个呼叫创建和丢弃的。如果要在多个Web服务调用之间共享状态,请使用静态字段。但请注意,在处理任何其他多线程代码时,您需要担心同样的问题。两个调用可能同时进行,因此您需要在适当的时候使用锁。

另外值得一提的是,IIS可以并且将随时以任何理由终止您的应用程序域,因此您不应该依赖于该字段将无限期地挂起的事实。如果您需要它来持久化,那么请使用数据库或其他持久存储。

答案 1 :(得分:1)

问题在于,虽然您的代理客户端对象(CardsGameServiceSoapClient)在两次调用之间处于活动状态,但每次调用您的服务都是一个全新的请求,并且服务器对象在每个请求上实例化....您需要为每个Web方法创建和初始化您的对象(可能在构造函数中初始化它?)