Поле класса веб-службы является пустым после выполнения веб-метода? - PullRequest
2 голосов
/ 13 января 2011

У меня есть проект веб-службы и проект WPF (который служит клиентом) в моем решении.

Класс, представляющий веб-сервис, довольно прост и выглядит следующим образом:

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()веб-метод, который возвращает набор карт.

Вот проблема:
Если я хочу позже вызвать веб-метод GetMagicCard(), он всегда возвращает null. Почему? Я создаю экземпляр CardsGameServiceSoapClient service только один раз, и этот объект жив до тех пор, пока я запускаю свое клиентское приложение.

Ответы [ 2 ]

2 голосов
/ 13 января 2011

Поскольку экземпляр WebService создается и отбрасывается для каждого вызова. Если вы хотите поделиться состоянием между несколькими вызовами веб-службы, используйте статическое поле. Но имейте в виду, что вам нужно беспокоиться о тех же проблемах, что и при работе с любым другим многопоточным кодом. Возможно одновременное выполнение двух вызовов, поэтому при необходимости необходимо использовать блокировки.

Стоит также упомянуть, что IIS может и будет прервать домен вашего приложения по любой причине в любое время, поэтому вам не следует полагаться на то, что поле будет зависать бесконечно. Если вам нужно сохранить его, используйте базу данных или другое постоянное хранилище.

1 голос
/ 13 января 2011

Проблема заключается в том, что, хотя ваш прокси-клиентский объект (CardsGameServiceSoapClient) активен между двумя вызовами, каждый вызов вашей службы является новым запросом, а объект сервера создается при каждом запросе .... вам потребуетсясоздать и инициализировать ваш объект для каждого веб-метода (возможно, инициализировать его в конструкторе?)

...