2010-05-28 6 views
2

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

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

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

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

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

Является ли это проблемой, связанной с государством, или я что-то упускаю?

+0

отправьте свой код/​​контракты, пожалуйста. – kd7

+1

Почему бы просто не позвонить? Попросите свой 'DisplayBusinessObjects' выполнить работу обоих. Тогда вы можете сохранить безгражданность. – Justin

ответ

3

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

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

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

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

+0

Хорошо! (15 символов) – Nate

0

Я согласен с @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; 
    } 
} 

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

Смежные вопросы