Использование WCF в приложении ASP.Net и передовой практике

Я совершенно не знаком с WCF. Я был уверен, что это будет работать как обычные веб-сервисы, и я также уверен, что тоже делаю это неправильно, но теперь я хочу убедиться, что делаю это правильно.

Приложение ASP.Net подключается к службе WCF через Интернет. Я выполнил базовую безопасность и использовал SSL. Он работает, но медленнее, чем когда у нас были регулярные веб-сервисы. Возвращаемые данные в основном такие же, как с обычной веб-службой.

Когда я использовал обычную веб-службу, в любое время, когда мне нужно было получать данные, я бы создал новый объект службы и вызвал функцию для необходимых мне данных. Казалось, что это работает нормально, но, как я мог себе представить, это не лучший способ сделать это, особенно если одновременно подключались тысячи пользователей. Поэтому, когда я конвертировал в WCF, я решил оставить одного клиента открытым и просто использовать его для всех, подключающихся к сайту. Я поместил его в кеш, и когда кеш удалил объект, у меня была функция обратного вызова для его удаления.

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

Итак, я изменил его на сеанс. Я либо реализовал это неправильно, либо просто обернулся, так как он вообще не работал. Клиент будет тайм-аут, причинить ошибку или просто не работать. Я изменил его обратно на кеширование и теперь работает нормально (за исключением медленных).

Что такое "лучшая практика" для этого сценария? Я создаю клиент "на лету", когда это необходимо, создайте один сеанс (и выясните, что я сделал не так), или сохраните его как есть и используйте метод кэширования одного клиента?

Ответ 1

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

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

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

Ответ 2

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

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

Марк

Ответ 3

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

Подробные сведения о реализации в этот блог, если вы заинтересованы.

Просто, чтобы прояснить то, что вы упомянули в вопросе - когда вы говорите "обычный веб-сервис", вы говорите об ASMX или?