Возможности упрощения WCFWCF Simplification Features

В этом разделе описываются новые возможности, упрощающие написание приложений WCF.This topic discusses new features that make writing WCF applications simpler.

Упрощенные сформированные файлы конфигурацииSimplified Generated Configuration Files

Клиентский файл конфигурации создается при добавлении ссылки на службу в Visual Studio или при использовании средства SvcUtil.exe.When you add a service reference in Visual Studio or use the SvcUtil.exe tool a client configuration file is generated. В предыдущих версиях WCF эти файлы конфигурации содержали значения каждого свойства привязки, даже если значение было значением по умолчанию.In previous versions of WCF these configuration files contained the value of every binding property even if its value is the default value. В WCF 4.5 сформированные файлы конфигурации содержат только те свойства привязки, которым присвоено значение не по умолчанию.In WCF 4.5 the generated configuration files contain only those binding properties that are set to a non-default value.

Далее приведен пример файла конфигурации, сформированного WCF 3.0.The following is an example of a configuration file generated by WCF 3.0.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false"
                    hostNameComparisonMode="StrongWildcard" maxBufferSize="65536"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192"
                        maxArrayLength="16384" maxBytesPerRead="4096"
                        maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>

Далее приведен пример того же файла конфигурации, сформированного WCF 4.5.The following is an example of the same configuration file generated by WCF 4.5.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>

Разработка в соответствии с парадигмой «Сначала контракт»Contract-First Development

WCF теперь поддерживает разработку в соответствии с парадигмой «Сначала контракт».WCF now has support for contract-first development. Средство svcutil.exe имеет переключатель/ServiceContract, который позволяет создавать контракты служб и данных из документа WSDL.The svcutil.exe tool has a /serviceContract switch which allows you to generate service and data contracts from a WSDL document.

Добавление ссылки на службу из проекта переносимого подмножестваAdd Service Reference From a Portable Subset Project

Проекты переносимого подмножества позволяют программистам, создающим сборки .NET поддерживать одно дерево исходного кода и система сборки, продолжая поддерживать несколько реализаций .NET (рабочий стол, Silverlight, Windows Phone и XBOX).Portable subset projects enable .NET assembly programmers to maintain a single source tree and build system while still supporting multiple .NET implementations (desktop, Silverlight, Windows Phone, and XBOX). Проекты переносимого подмножества ссылаться только на переносимые библиотеки .NET, которые являются сборкой .NET framework, который может использоваться в любой реализации .NET.Portable subset projects only reference .NET portable libraries which are a .NET framework assembly that can be used on any .NET implementation. Процесс добавления такой же, как и при добавлении ссылки на службу в рамках любого другого клиентского приложения WCF.The developer experience is the same as adding a service reference within any other WCF client application. Дополнительные сведения см. в разделе добавить ссылку на службу в проект переносного подмножества.For more information, see Add Service Reference in a Portable Subset Project.

Изменились значения по умолчанию для режима совместимости с ASP.NETASP.NET Compatibility Mode Default Changed

WCF предоставляет режим совместимости с ASP.NET, дающий разработчикам при создании служб WCF полный доступ к функциям HTTP-конвейера ASP.NET.WCF provides ASP.NET compatibility mode to grant developers full access to the features in the ASP.NET HTTP pipeline when writing WCF services. Для использования этого режима необходимо задать aspNetCompatibilityEnabled атрибута в значение true в <serviceHostingEnvironment > разделе файла web.config. Кроме того, у любой службы в данном домене приложения свойство RequirementsMode в ее атрибуте AspNetCompatibilityRequirementsAttribute должно быть задано как значение Allowed или Required.To use this mode, you must set the aspNetCompatibilityEnabled attribute to true in the <serviceHostingEnvironment> section of web.config. Additionally, any service in this appDomain needs to have the RequirementsMode property on its AspNetCompatibilityRequirementsAttribute set to Allowed or Required. По умолчанию AspNetCompatibilityRequirementsAttribute теперь настроен для Allowed и значение по умолчанию WCF службы задает шаблон приложения aspNetCompatibilityEnabled атрибут true.By default AspNetCompatibilityRequirementsAttribute is now set to Allowed and the default WCF service application template sets the aspNetCompatibilityEnabled attribute to true. Дополнительные сведения см. в разделе новые возможности в Windows Communication Foundation 4.5 и службы WCF и ASP.NET.For more information, see What's New in Windows Communication Foundation 4.5 and WCF Services and ASP.NET.

Улучшения в потоковой передаче данныхStreaming Improvements

  • В WCF была добавлена новая поддержка асинхронной потоковой передачи данных.New support for asynchronous streaming has been added to WCF. Чтобы включить поддержку асинхронной потоковой передачи данных, добавьте поведение конечной точки DispatcherSynchronizationBehavior в основное приложение службы и установите свойству AsynchronousSendEnabled значение true.To enable asynchronous streaming, add the DispatcherSynchronizationBehavior endpoint behavior to the service host and set its AsynchronousSendEnabled property to true. Это может улучшить масштабируемость, когда служба отправляет потоковые сообщения нескольким клиентам, которые медленно считывают сообщения.This can benefit scalability when a service is sending streamed messages to multiple clients which are reading slowly. WCF больше не блокирует один поток для каждого клиента и освобождает поток для обслуживания другого клиента.WCF does not block one thread per client anymore and will free up the thread to service another client.

  • Убраны ограничения для буферизации сообщений, возникающие, когда служба размещается в IIS.Removed limitations around buffering of messages when a service is IIS hosted. В предыдущих версиях WCF при получении сообщения для размещенной в IIS службы, использующей потоковую передачу, ASP.NET перед отправкой сообщения в WCF поместило бы его в буфер целиком.In previous versions of WCF when receiving a message for an IIS-hosted service that used streaming message transfer, ASP.NET would buffer the entire message before sending it to WCF. Это привело бы к использованию большого объема памяти.This would cause large memory consumption. Эта буферизация была ликвидирована в .NET 4.5, и теперь WCF-службы, размещаемые в IIS, могут начинать обработку входящего потока до получения всего сообщения, поэтому реализуется истинная потоковая передача данных.This buffering has been removed in .NET 4.5 and now IIS-hosted WCF services can start processing the incoming stream before the entire message has been received, thereby enabling true streaming. Это позволяет WCF-службам моментально реагировать на сообщения, улучшая производительность.This allows WCF to respond immediately to messages and allows improved performance. Кроме того, теперь вам больше не требуется указывать значение для maxRequestLength, ограничивающего размер входящих запросов в ASP.NET.In addition, you no longer have to specify a value for maxRequestLength, the ASP.NET size limit on incoming requests. Если данное свойство установлено, то оно не учитывается.If this property is set, it is ignored. Дополнительные сведения о maxRequestLength см. в разделе <httpRuntime > элемент конфигурации.For more information about maxRequestLength see <httpRuntime> configuration element. По-прежнему требуется настройку параметра maxAllowedContentLength, Дополнительные сведения, см. в разделе ограничение запросов IIS.You will still need to configure the maxAllowedContentLength, For more information, see IIS Request Limits.

Новые значения по умолчанию для свойств транспортаNew Transport Default Values

В следующей таблице описываются измененные настройки и разделы, в которых можно найти дополнительные сведения.The following table describes the settings that have changed and where to find additional information.

СвойствоProperty включитьOn Новое значение по умолчаниюNew Default Дополнительные сведенияMore Information
channelInitializationTimeoutchannelInitializationTimeout NetTcpBinding 30 секунд30 seconds Это свойство определяет, сколько подключение TCP может выполнить свою проверку подлинности с помощью протокола кадрирования .NET.This property determines how long a TCP connection can take to authenticate itself using the .NET Framing protocol. Клиенту необходимо отправить некоторые исходные данные, прежде чем сервер получит достаточно сведений для аутентификации.A client needs to send some initial data before the server has enough information to perform authentication. Это время ожидания специально сделано меньше значения параметра ReceiveTimeout (10 мин) для того, чтобы непроверенные вредоносные клиенты не сохраняли соединение с сервером в течение долгого времени.This timeout is intentionally made smaller than the ReceiveTimeout (10 min) so that malicious unauthenticated clients do not keep the connections tied up to the server for long. Значение по умолчанию - 30 секунды.The default value is 30 seconds. Дополнительные сведения о ChannelInitializationTimeoutFor more information about ChannelInitializationTimeout
listenBackloglistenBacklog NetTcpBinding 16 * количество процессоров16 * number of processors Это свойство уровня сокетов, которое описывает количество допустимых, ожидающих подтверждения запросов в очереди.This socket-level property describes the number of "pending accept" requests to be queued. Если очередь по невыполненной работе по ожиданию передачи данных заполнится полностью, новые запросы будут отклоняться.If the listen backlog queue fills up, new socket requests will be rejected. Дополнительные сведения о ListenBacklogFor more information about ListenBacklog
maxPendingAcceptsmaxPendingAccepts ConnectionOrientedTransportBindingElementConnectionOrientedTransportBindingElement

SMSvcHost.exeSMSvcHost.exe
2 * количество процессоров для транспорта2 * number of processors for transport

4 * количество процессоров для SMSvcHost.exe4 * number of processors for SMSvcHost.exe
Это свойство ограничивает число каналов, которое может прослушиваться в режиме ожидания на сервере.This property limits the number of channels that the server can have waiting on a listener. Когда параметру MaxPendingAccepts задано слишком маленькое значение, возникает небольшой промежуток времени, в течение которого ожидающие каналы начнут обслуживать подключения, но новые каналы прослушиваться не будут.When MaxPendingAccepts is too low, there will be a small interval of time in which all of the waiting channels have started servicing connections, but no new channels have begun listening. Соединение может произойти именно в этот интервал, и оно не будет установлено, потому что на сервере нет ожидающих каналов.A connection can arrive during this interval and will fail because nothing is waiting for it on the server. Это свойство может быть сконфигурировано путем задания свойству MaxPendingConnections большего значения.This property can be configured by setting the MaxPendingConnections property to a larger number. Дополнительные сведения см. в разделе MaxPendingAccepts и Настройка службы совместного использования портов Net.TCPFor more information, see MaxPendingAccepts and Configuring the Net.TCP Port Sharing Service
maxPendingConnectionsmaxPendingConnections ConnectionOrientedTransportBindingElementConnectionOrientedTransportBindingElement 12 * количество процессоров12 * number of processors Это свойство определяет количество соединений, которое может быть принято транспортом, но которое не было принято диспетчером ServiceModel.This property controls how many connections a transport has accepted but have not been picked up by the ServiceModel Dispatcher. Для настройки этого значения используйте свойство MaxConnections привязки или свойство maxOutboundConnectionsPerEndpoint элемента привязки.To set this value, use MaxConnections on the binding or maxOutboundConnectionsPerEndpoint on the binding element. Дополнительные сведения о MaxPendingConnectionsFor more information about MaxPendingConnections
receiveTimeoutreceiveTimeout SMSvcHost.exeSMSvcHost.exe 30 секунд30 seconds Это свойство определяет время ожидания для чтения данных кадрирования TCP и проведения распределения подключений из базовых подключений.This property specifies the timeout for reading the TCP framing data and performing connection dispatching from the underlying connections. Это выполняется, чтобы ограничить время, которое служба SMSvcHost.exe тратит на считывание начальных данных из входящего соединения.This exists to put a cap on the amount of time SMSvcHost.exe service is kept engaged to read the preamble data from an incoming connection. Дополнительные сведения см. в разделе Настройка службы совместного использования портов Net.TCP.For more information, see Configuring the Net.TCP Port Sharing Service.

Примечание

Эти новые значения по умолчанию используются только при развертывании службы WCF на компьютере с платформой .NET Framework 4.5.These new defaults are used only if you deploy the WCF service on a machine with .NET Framework 4.5. При развертывании той же службы на компьютере с платформой .NET Framework 4.0 используются значения по умолчанию платформы .NET 4.0.If you deploy the same service on a machine with .NET Framework 4.0, then the .NET Framework 4.0 defaults are used. В таких случаях рекомендуется настроить эти параметры явно.In such cases it is recommended to configure these settings explicitly.

XmlDictionaryReaderQuotasXmlDictionaryReaderQuotas

XmlDictionaryReaderQuotas содержит настраиваемые значения квот для средств чтения словаря XML, которые ограничивают объем памяти, используемый кодировщиком при создании сообщения.XmlDictionaryReaderQuotas contains configurable quota values for XML dictionary readers which limit the amount of memory utilized by an encoder while creating a message. Хотя эти квоты и можно изменить, значения по умолчанию были изменены так, чтобы разработчикам редко приходилось их менять.While these quotas are configurable, the default values have changed to lessen the possibility that a developer will need to set them explicitly. Квота MaxReceivedMessageSize не была изменена, и с ее помощью можно по-прежнему ограничить потребление памяти, избегнув таким образом работы со сложными XmlDictionaryReaderQuotas.MaxReceivedMessageSize quota has not been changed so that it can still limit memory consumption preventing the need for you to deal with the complexity of the XmlDictionaryReaderQuotas. В следующей таблице приведены квоты, их новые значения по умолчанию и краткое описание, для чего используется каждая квота.The following table shows the quotas, their new default values and a brief explanation of what each quota is used for.

Имя квотыQuota Name Значение по умолчаниюDefault Value ОписаниеDescription
MaxArrayLength Int32.MaxValueInt32.MaxValue Возвращает и задает максимально допустимую длину массива.Gets and sets the maximum allowed array length. Эта квота ограничивает максимальный размер массива примитивов, возвращаемых средством чтения XML, включая байтовые массивы.This quota limits the maximum size of an array of primitives that the XML reader returns, including byte arrays. Эта квота ограничивает потребление памяти не в самом средстве чтения XML, а в компоненте, использующем средство чтения.This quota does not limit memory consumption in the XML reader itself, but in whatever component that is using the reader. Например, когда DataContractSerializer использует средство чтения, защищенное MaxArrayLength, оно не десериализует байтовые массивы, чей размер превышает указанное в этой квоте значение.For example, when the DataContractSerializer uses a reader secured with MaxArrayLength, it does not deserialize byte arrays larger than this quota.
MaxBytesPerRead Int32.MaxValueInt32.MaxValue Возвращает и задает максимально допустимое число байтов, возвращаемых для каждой операции чтения.Gets and sets the maximum allowed bytes returned for each read. Эта квота ограничивает число байтов, которые считываются за одну операцию считывания при чтении открывающего тега элемента и его атрибутов.This quota limits the number of bytes that are read in a single Read operation when reading the element start tag and its attributes. (В случае непотоковой передачи данных само имя элемента не входит в квоту.)(In non-streamed cases, the element name itself is not counted against the quota). Наличие слишком большого числа атрибутов XML может привести к неоправданно большому времени обработки, поскольку требуется проверка уникальности имен атрибутов.Having too many XML attributes may use up disproportionate processing time because attribute names have to be checked for uniqueness. MaxBytesPerRead устраняет эту возможную проблему.MaxBytesPerRead mitigates this threat.
MaxDepth Глубина в 128 узлов128 nodes deep Эта квота ограничивает максимальную глубину вложенности XML-элементов.This quota limits the maximum nesting depth of XML elements. MaxDepth взаимодействует с MaxBytesPerRead: средство чтения всегда сохраняет в памяти данные по текущему элементу и всем его предкам, поэтому максимальный потребляемый средством чтения объем памяти пропорционален произведению этих двух параметров.MaxDepth interacts with MaxBytesPerRead: the reader always keeps data in memory for the current element and all of its ancestors, so the maximum memory consumption of the reader is proportional to the product of these two settings. При десериализации графа объекта с глубоким вложением десериализатор принудительно получает доступ ко всему стеку, и выдается неисправимое исключение StackOverflowException.When deserializing a deeply-nested object graph, the deserializer is forced to access the entire stack and throw an unrecoverable StackOverflowException. Между вложением XML и вложением объекта существует прямая связь как для DataContractSerializer , так и для XmlSerializer.A direct correlation exists between XML nesting and object nesting for both the DataContractSerializer and the XmlSerializer. MaxDepth используется для устранения этой проблемы.MaxDepth is used to mitigate this threat.
MaxNameTableCharCount Int32.MaxValueInt32.MaxValue Эта квота ограничивает максимальное количество символов, разрешенных в таблице имен.This quota limits the maximum number of characters allowed in a nametable. В таблице имен содержатся определенные строки (например пространства имен и префиксы), возникающие при обработке документа XML.The nametable contains certain strings (such as namespaces and prefixes) that are encountered when processing an XML document. Поскольку эти строки буферизуются в память, эта квота используется для предотвращения чрезмерной буферизации, если ожидается потоковая передача.As these strings are buffered in memory, this quota is used to prevent excessive buffering when streaming is expected.
MaxStringContentLength Int32.MaxValueInt32.MaxValue Эта квота ограничивает максимальный размер строки, возвращаемой средством чтения XML.This quota limits the maximum string size that the XML reader returns. Эта квота ограничивает потребление памяти не в самом средстве чтения XML, а в компоненте, использующем средство чтения.This quota does not limit memory consumption in the XML reader itself, but in the component that is using the reader. Например, когда DataContractSerializer использует средство чтения, защищенное MaxStringContentLength, он не десериализует строки, чей размер превышает указанное в этой квоте значение.For example, when the DataContractSerializer uses a reader secured with MaxStringContentLength, it does not deserialize strings larger than this quota.

Важно!

См. «Безопасное использование XML» в разделе вопросы безопасности для данных Дополнительные сведения о безопасности ваших данных.Refer to "Using XML Safely" under Security Considerations for Data for more information about securing your data.

Примечание

Эти новые значения по умолчанию используются только при развертывании службы WCF на компьютере с платформой .NET Framework 4.5.These new defaults are used only if you deploy the WCF service on a machine with .NET Framework 4.5. При развертывании той же службы на компьютере с платформой .NET Framework 4.0 используются значения по умолчанию платформы .NET 4.0.If you deploy the same service on a machine with .NET Framework 4.0, then the .NET Framework 4.0 defaults are used. В таких случаях рекомендуется настроить эти параметры явно.In such cases it is recommended to configure these settings explicitly.

Проверка конфигурации WCFWCF Configuration Validation

Будучи частью процесса сборки в Visual Studio, файлы конфигурации WCF теперь проверяются.As part of the build process within Visual Studio, WCF configuration files are now validated. Если проверка завершается с ошибкой, то в Visual Studio отображается список ошибок и предупреждений.A list of validation errors or warnings are displayed in Visual Studio if the validation fails.

Подсказки в редакторе XMLXML Editor Tooltips

В XML-редакторе Visual Studio отображаются подсказки для каждого элемента конфигурации (и его свойств), входящего в файл конфигурации службы. Это облегчает работу разработчиков по конфигурации WCF-служб.In order to help new and existing WCF service developers to configure their services, the Visual Studio XML editor now provides tooltips for every configuration element and its properties that is part of the service configuration file.

Улучшения для BasicHttpBindingBasicHttpBinding Improvements

  1. Позволяет одной конечной точке WCF отвечать на разные режимы проверки подлинности.Enables a single WCF endpoint to respond to different authentication modes.

  2. Позволяет IIS контролировать настройки безопасности WCF-службы.Enables a WCF service’s security settings to be controlled by IIS