Применение WCF
Фреймворк , появившийся в версии .NET 3.0, быстро стал стандартом де-факто организации сетевых взаимодействий в приложениях для .NET. Он поддерживает огромное множество сетевых протоколов и настроек, и непрерывно расширяется с каждой новой версией .NET. В этой статье рассказывается о приемах оптимизации фреймворка WCF.
Пороговые значения
Фреймворк WCF, в особенности до выхода версии .NET Framework 4.0, имел довольно консервативные пороговые значения. Основная их цель — обеспечить защиту от атак типа «отказ в обслуживании» (Denial of Service, DoS), но, к сожалению, в реальном мире они часто оказываются слишком строгими.
Настройки ограничений можно изменить, отредактировав раздел system.serviceModel либо в файле app.config (для обычных приложений), либо в файле web.config — для приложений ASP.NET:
Другой способ изменить эти параметры — настроить свойства объекта ServiceThrottle на этапе создания службы:
Давайте разберемся, что означают все эти параметры:
MaxConcurrentSessions
Ограничивает количество сообщений, одновременно обрабатываемых узлом службы ServiceHost. При превышении этого предела сообщения будут помещаться в очередь. В .NET 3.5 по умолчанию используется значение 10, а в .NET 4 это значение получается, как произведение числа процессоров на 100.
MaxConcurrentCalls
Ограничивает количество объектов InstanceContext, обрабатываемых одновременно узлом службы ServiceHost. Запросы на создание дополнительных экземпляров помещаются в очередь и обрабатываются, когда количество объектов InstanceContext оказывается ниже указанного уровня. В .NET 3.5 по умолчанию используется значение 16, а в .NET 4 это значение получается, как произведение числа процессоров на 16.
MaxConcurrentInstances
Ограничивает количество сеансов, одновременно обслуживаемых узлом службы ServiceHost. Служба будет продолжать принимать соединения сверх указанного ограничения, но активными будут только каналы ниже этой границы (сообщения будут читаться из каналов). В .NET 3.5 по умолчанию используется значение 26, а в .NET 4 это значение получается, как произведение числа процессоров на 116.
Еще одно важное ограничение — количество параллельных соединений на каждый хост, которое по умолчанию равно двум. Если ваше приложение ASP.NET обращается к внешней службе WCF, это ограничение может оказаться узким местом. Ниже приводится пример конфигурации, где определяется это ограничение:
Модель обработки
При разработке службы WCF вам потребуется определить ее модель активации и параллельной обработки. Сделать это можно с помощью свойств InstanceContextMode и ConcurrencyMode атрибута ServiceBehavior, соответственно. Свойство InstanceContextMode может принимать следующие значения:
PerCall — объект экземпляра службы создается для каждого вызова;
PerSession (по умолчанию) — объект экземпляра службы создается для каждого сеанса; если канал не поддерживает сеансы, это значение интерпретируется как PerCall;
Single — для всех вызовов повторно используется один и тот же объект экземпляра службы.
Свойство ConcurrencyMode может принимать следующие значения:
Single (по умолчанию) — объект службы является однопоточным и не поддерживает реентерабельность. Если InstanceContextMode устанавливается в значение Single, когда уже идет обслуживание запроса, новые запросы будут становиться в очередь, ожидая обработки.
Reentrant — объект службы является однопоточным, но поддерживает реентерабельность. Когда служба вызывает другую службу, она может вызываться реентерабельно. В этом случае вам придется позаботиться о сохранении целостности состояния объекта перед обращением к другой службе.
Multiple — объект службы является многопоточным, но не гарантирует синхронизацию между потоками, поэтому служба должна предусматривать средства синхронизации, чтобы обеспечить целостность состояния.
Не используйте значения Single и Reentrant в свойстве ConcurrencyMode в сочетании со значением Single в свойстве InstanceContextMode. При использовании значения Multiple в свойстве ConcurrencyMode, используйте блокировки с высокой степенью детализации, чтобы уменьшить вероятность конкуренции между потоками.
Фреймворк WCF вызывает объекты службы из пула потоков завершения ввода/вывода, описанного ранее. Если в ходе обработки запросов понадобится выполнять синхронные операции ввода/вывода или ждать некоторого события, вам может потребоваться увеличить количество потоков, что можно сделать, отредактировав раздел system.web в конфигурационном файле приложения для ASP. NET или вызвав ThreadPool.SetMinThreads() и ThreadPool.SetMaxThreads() в обычном приложении.
Кэширование в WCF
Фреймворк WCF не имеет встроенной поддержки кеширования. Даже если ваша служба на основе фреймворка WCF выполняется под управлением IIS, она все равно не сможет использовать его кеш по умолчанию. Чтобы включить поддержку кеширования, отметьте свой класс WCF-службы атрибутом AspNetCompatibilityRequirements:
Кроме того, включите совместимость с ASP.NET, отредактировав файл web.config и добавив следующий элемент в раздел system.serviceModel:
Начиная с версии .NET Framework 4.0 имеется возможность использовать новые типы System.Runtime.Caching для реализации поддержки кеширования. Они не зависят от сборки System.Web и поэтому могут использоваться не только в приложениях ASP.NET.
Асинхронные клиенты и серверы WCF
Фреймворк WCF позволяет выполнять асинхронные операции, как на стороне клиента, так и на стороне сервера. Каждая сторона может принимать независимое решение об использовании синхронных и асинхронных операций.
На стороне клиента поддерживается два способа асинхронного обращения к службе: на основе событий и с применением шаблона организации асинхронных взаимодействий в .NET. Модель на основе событий не совместима с каналами, созданными с помощью ChannelFactory. Чтобы получить возможность применить модель на основе событий, необходимо сгенерировать прокси-объект доступа к службе с помощью инструмента svcutil.exe, вызвав его с ключами /async и /tcv:Version35:
После этого прокси-объект можно использовать, как показано ниже:
В случае выбора модели на основе интерфейса IAsyncResult следует создать прокси-объект, вызвав svcutil.exe с ключом /async, но без ключа /tcv:version35. А затем реализовать функции обратного вызова и использовать методы Begin. прокси-объекта как показано ниже:
На сервере асинхронный режим работы можно организовать за счет создания версий Begin. и End. контрактных операций. У вас не должно быть других операций с теми же именами, без префиксов Begin/End, потому что фреймворк WCF будет стремиться использовать их. Следуйте этим соглашениям об именовании, потому что в WCF они являются обязательными.
Метод Begin. должен принимать входные параметры и возвращать значение IAsyncResult, а сама операция ввода/вывода должна производиться асинхронно. Метод Begin. должен быть снабжен атрибутом OperationContract с параметром AsyncPattern, имеющим значение true.
Метод End. должен принимать параметр типа IAsyncResult, возвращать необходимое значение и иметь требуемые выходные параметры. Объект IAsyncResult (возвращаемый методом Begin. ) должен содержать всю необходимую информацию о возвращаемом результате.
Кроме всего прочего, версия WCF 4.5 поддерживает новый шаблон async/await на основе класса Task для организации асинхронного ввода/вывода в серверных и клиентских приложениях. Например:
Привязки
При проектировании служб на основе фреймворка WCF очень важно правильно выбрать механизм привязки. Каждый из этих механизмов обладает своими особенностями и характеристиками производительности. Старайтесь выбирать как можно более простые привязки и не используйте больше их особенностей, чем это необходимо для работы службы. Многие особенности, такие как надежность, безопасность и поддержка аутентификации, привносят дополнительные накладные расходы, поэтому применяйте их, только когда без этого не обойтись.
Во взаимодействиях между процессами, выполняющимися на одном компьютере, наилучшей производительностью обладает привязка Named Pipe. В двусторонних взаимодействиях между разными компьютерами наилучшей производительностью обладает привязка Net TCP. Однако этот механизм может применяться, только для работы с клиентами на основе WCF и не может использоваться для организации взаимодействий разнородных систем. Кроме того, он не поддерживает возможность распределения нагрузки, так как связывает сеанс с определенным адресом сервера.
Чтобы получить производительность, близкую к производительности привязки TCP, и при этом сохранить совместимость со средствами распределения нагрузки, можно использовать собственную привязку HTTP, реализующую обмен данными в двоичном формате. Ниже приводится пример настройки такой привязки:
Наконец, при возможности выбирайте простейшую привязку HTTP вместо WS-совместимой. Последняя использует не такой компактный формат сообщений.
Учебник. Создание клиента Windows Communication Foundation Tutorial: Create a Windows Communication Foundation client
В этом руководстве описываются четвертые из пяти задач, необходимых для создания базового приложения Windows Communication Foundation (WCF). This tutorial describes the fourth of five tasks required to create a basic Windows Communication Foundation (WCF) application. Общие сведения о учебниках см. в разделе учебник. Начало работы с Windows Communication Foundation приложениями. For an overview of the tutorials, see Tutorial: Get started with Windows Communication Foundation applications.
Следующей задачей для создания приложения WCF является создание клиента путем извлечения метаданных из службы WCF. The next task for creating a WCF application is to create a client by retrieving metadata from a WCF service. Для добавления ссылки на службу, которая получает метаданные из конечной точки обмена метаданными службы, используется Visual Studio. You use Visual Studio to add a service reference, which gets the metadata from the service’s MEX endpoint. Затем Visual Studio создает управляемый файл исходного кода для прокси клиента на выбранном языке. Visual Studio then generates a managed source code file for a client proxy in the language you’ve chosen. Он также создает файл конфигурации клиента (App.config). It also creates a client configuration file (App.config). Этот файл позволяет клиентскому приложению подключаться к службе в конечной точке. This file enables the client application to connect to the service at an endpoint.
При вызове службы WCF из проекта библиотеки классов в Visual Studio используйте функцию Добавление ссылки на службу для автоматического создания прокси-сервера и связанного файла конфигурации. If you call a WCF service from a class library project in Visual Studio, use the Add Service Reference feature to automatically generate a proxy and associated configuration file. Однако, поскольку проекты библиотеки классов не используют этот файл конфигурации, необходимо добавить параметры в созданный файл конфигурации в файл App.config для исполняемого файла, вызывающего библиотеку классов. However, because class library projects don’t use this configuration file, you need to add the settings in the generated configuration file to the App.config file for the executable that calls the class library.
В качестве альтернативы для создания прокси-класса и файла конфигурации вместо Visual Studio следует использовать средство служебной программы для метаданных ServiceModel . As an alternative, use the ServiceModel Metadata Utility tool instead of Visual Studio to generate the proxy class and configuration file.
Клиентское приложение использует созданный прокси-класс для взаимодействия со службой. The client application uses the generated proxy class to communicate with the service. Эта процедура описана в разделе учебник. Использование клиента. This procedure is described in Tutorial: Use a client.
В этом руководстве вы узнаете, как: In this tutorial, you learn how to:
- Создание и Настройка проекта консольного приложения для клиента WCF. Create and configure a console app project for the WCF client.
- Добавьте ссылку на службу WCF для создания прокси-класса и файлов конфигурации. Add a service reference to the WCF service to generate the proxy class and configuration files.
Создание клиента Windows Communication Foundation Create a Windows Communication Foundation client
Создание проекта консольного приложения в Visual Studio: Create a console app project in Visual Studio:
В меню файл выберите команду Открыть > проект или решение и перейдите к созданному ранее решению GettingStarted (GettingStarted. sln). From the File menu, select Open > Project/Solution and browse to the GettingStarted solution you previously created (GettingStarted.sln). Щелкните Open(Открыть). Select Open.
В меню вид выберите Обозреватель решений. From the View menu, select Solution Explorer.
В окне Обозреватель решений выберите решение GettingStarted (верхний узел), а затем в контекстном меню выберите добавить > Новый проект . In the Solution Explorer window, select the GettingStarted solution (top node), and then select Add > New Project from the shortcut menu.
В левой части окна Добавление нового проекта выберите категорию Рабочий стол Windows в разделе Visual C# или Visual Basic. In the Add New Project window, on the left side, select the Windows Desktop category under Visual C# or Visual Basic.
Выберите шаблон консольное приложение (.NET Framework) и введите GettingStartedClient в поле имя. Select the Console App (.NET Framework) template, and enter GettingStartedClient for the Name. Щелкните ОК. Select OK.
Добавьте ссылку в проект GettingStartedClient в System.ServiceModel сборку: Add a reference in the GettingStartedClient project to the System.ServiceModel assembly:
В окне Обозреватель решений выберите папку References в проекте GettingStartedClient , а затем в контекстном меню выберите пункт Добавить ссылку . In the Solution Explorer window, select the References folder under the GettingStartedClient project, and then select Add Reference from the shortcut menu.
В окне Добавление ссылки в разделе сборки в левой части окна выберите платформа. In the Add Reference window, under Assemblies on the left side of the window, select Framework.
Найдите и выберите System. ServiceModel, а затем нажмите кнопку ОК. Find and select System.ServiceModel, and then choose OK.
Сохраните решение, выбрав файл > сохранить все. Save the solution by selecting File > Save All.
Добавьте ссылку на службу в службу калькулятора: Add a service reference to the calculator service:
В окне Обозреватель решений выберите папку References в проекте GettingStartedClient , а затем в контекстном меню выберите Добавление ссылки на службу . In the Solution Explorer window, select the References folder under the GettingStartedClient project, and then select Add Service Reference from the shortcut menu.
В окне Добавление ссылки на службу выберите Обнаружение. In the Add Service Reference window, select Discover.
Служба CalculatorService запускается, и Visual Studio отображает ее в окне службы . The CalculatorService service starts and Visual Studio displays it in the Services box.
Выберите CalculatorService , чтобы развернуть его и отобразить контракты службы, реализованные службой. Select CalculatorService to expand it and display the service contracts implemented by the service. Оставьте пространство имен по умолчанию и нажмите кнопку ОК. Leave the default Namespace and choose OK.
Visual Studio добавит новый элемент в папку подключенные службы проекта GettingStartedClient . Visual Studio adds a new item under the Connected Services folder in the GettingStartedClient project.
Средство служебной программы метаданных ServiceModel ServiceModel Metadata Utility tool
В следующих примерах показано, как при необходимости использовать средство служебной программы метаданных ServiceModel (Svcutil.exe) для создания файла прокси-класса. The following examples show how to optionally use the ServiceModel Metadata Utility tool (Svcutil.exe) to generate the proxy class file. Это средство создает файл прокси-класса и файл App.config . This tool generates the proxy class file and the App.config file. В следующих примерах показано, как создать прокси-сервер в C# и Visual Basic соответственно: The following examples show how to generate the proxy in C# and Visual Basic, respectively:
Файл конфигурации клиента Client configuration file
После создания клиента Visual Studio создаст файл конфигурации App.config в проекте GettingStartedClient , который должен быть похож на следующий пример: After you’ve created the client, Visual Studio creates the App.config configuration file in the GettingStartedClient project, which should be similar to the following example:
В разделе Обратите внимание на элемент. Under the section, notice the element. Элемент ** ** определяет конечную точку, которую клиент использует для доступа к службе следующим образом: The element defines the endpoint that the client uses to access the service as follows:
- Адрес: http://localhost:8000/GettingStarted/CalculatorService . Address: http://localhost:8000/GettingStarted/CalculatorService . Адрес конечной точки. The address of the endpoint.
- Контракт службы: ServiceReference1.ICalculator . Service contract: ServiceReference1.ICalculator . Контракт службы обрабатывает взаимодействие между клиентом WCF и службой. The service contract handles communication between the WCF client and the service. Visual Studio создала этот контракт при использовании функции Добавление ссылки на службу . Visual Studio generated this contract when you used its Add Service Reference function. По сути, это копия контракта, определенного в проекте Жеттингстартедлиб. It’s essentially a copy of the contract that you defined in the GettingStartedLib project.
- Привязка: WSHttpBinding . Binding: WSHttpBinding. Привязка указывает HTTP как транспорт, взаимодействующую безопасность и другие сведения о конфигурации. The binding specifies HTTP as the transport, interoperable security, and other configuration details.
Дальнейшие действия Next steps
В этом руководстве вы узнали, как выполнять следующие задачи: In this tutorial, you learned how to:
- Создание и Настройка проекта консольного приложения для клиента WCF. Create and configure a console app project for the WCF client.
- Добавьте ссылку на службу WCF, чтобы создать класс прокси и файлы конфигурации для клиентского приложения. Add a service reference to the WCF service to generate the proxy class and configuration files for the client application.
Перейдите к следующему руководству, чтобы узнать, как использовать созданный клиент. Advance to the next tutorial to learn how to use the generated client.