Простой вопрос WCF

Поэтому я изучаю WCF и столкнулся с проблемой, которая, по моему мнению, связана с контролем / состоянием экземпляра, но я не уверен.

Рабочий процесс выглядит следующим образом: базовая парадигма клиент / сервер.

  1. Клиент вызывает метод RetrieveBusinessObjects(критерии), а сервер вызывает слой данных, а затем помещает их в список IList на стороне сервера. Он не возвращает этот список вызывающему клиенту.

  2. Затем клиент будет вызывать метод скажем DisplayBusinessObjects(), который будет извлекать IList с сервера, сериализовать их, передавать по проводам и отображать их.

Если я попробую это с помощью WCFTestClient, это будет работать. Если я запускаю его с реального клиента, я получаю BusinessObject[] размером 0. Что для меня означает, что у меня нет объектов для возврата.

Это вопрос о состоянии штата или я что-то упустил?

2 ответа

Вы должны учитывать это: по умолчанию каждый вызов службы WCF приведет к созданию только что созданного экземпляра класса обслуживания.

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

Ваш второй вызов DisplayBusinessObjects() снова получит новый экземпляр класса обслуживания - и он не знает о предыдущем вызове, поэтому у него не может быть ничего в его массиве BusinessObject - в конце концов, это свежий экземпляр.

Этот сценарий не работает должным образом - вам нужно перестроить свое решение так, чтобы один вызов извлек и возвратил список бизнес-объектов, а затем кэшировал их на клиенте. Или вам нужно использовать постоянный кеш / хранилище на сервере для кеширования тех элементов, которые выбираются между вызовами.

Я согласен с @marc_s в том, что вам следует подумать о том, чтобы сделать ваши сервисные операции более грубыми, и рассмотреть возможность их объединения в одну операцию. Вы не указываете, почему ваш первый вызов должен хранить данные в слое обслуживания и возвращать их только во втором вызове.

Однако, если вам абсолютно необходим этот подход в реализации службы, вы можете реализовать службу с использованием экземпляров для каждой сессии:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyService : IService
{
   private MyState _myState;

   public MyService()
   {
      _myState = new MyState();
   }

   public void RetrieveBusinessObjects(...)
   {
      _myState.Items = GetDataFromDataLayer();
   }

   public IList<Item> DisplayBusinessObjects()
   {
      return _myState.Items;
   }
}

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

Другие вопросы по тегам