Клиентские приложения среднего уровня

В этом разделе рассматриваются различные проблемы, связанные с клиентскими приложениями среднего уровня, используюющими Windows Communication Foundation (WCF).

Увеличение производительности клиента среднего уровня

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

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

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

  • ChannelFactory<TChannel> Создайте объект, а затем используйте этот объект для создания новых объектов клиентского канала WCF для каждого вызова.

При использовании этих подходов следует рассмотреть следующие вопросы.

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

  • Если служба должна выполнять проверку подлинности на основе каждого клиента, необходимо создать новый клиент для каждого входящего запроса на среднем уровне вместо повторного использования клиента WCF (или объекта клиентского канала WCF), так как учетные данные клиента среднего уровня нельзя изменить после создания клиента WCF (или ChannelFactory<TChannel>).

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

  • Каналы со сбоем необходимо обрабатывать независимо от того, используется ли канал совместно. Однако, если каналы используются повторно, канал со сбоем может привести к отмене нескольких ожидающих запросов или отправок.

Пример, демонстрирующий рекомендации по повторному использованию клиента для нескольких запросов, см. в разделе "Привязка данных" в клиенте ASP.NET.

Кроме того, можно повысить производительность запуска для тех клиентов, которые используют типы данных, сериализуемые с помощью XmlSerializer кода создания и компиляции сериализации для этих типов данных во время выполнения, что может привести к замедлению производительности запуска. Средство служебной программы метаданных ServiceModel (Svcutil.exe) может повысить производительность запуска для этих приложений, создав необходимый код сериализации из скомпилированных сборок для приложения. Дополнительные сведения см. в разделе "Практическое руководство. Улучшение времени запуска клиентских приложений WCF с помощью xmlSerializer".

См. также