Поделиться через


Функции упрощения WCF

В этом разделе рассматриваются новые функции, которые упрощают написание приложений WCF.

gRPC в качестве альтернативы WCF

gRPC — это современная платформа RPC, которая является популярной альтернативой WCF. gRPC построен на основе HTTP/2, что обеспечивает ряд преимуществ по сравнению с WCF, в том числе:

  • Производительность: gRPC гораздо эффективнее, чем WCF, особенно для длительных подключений.
  • Масштабируемость: gRPC предназначен для масштабирования до большого количества клиентов и серверов.
  • Безопасность: gRPC поддерживает различные механизмы безопасности, включая TLS и проверку подлинности.
  • Кроссплатформенный: gRPC является платформо-нейтральным и может использоваться с различными языками программирования.

Дополнительные сведения о разработке или переносе приложений WCF в gRPC см. в следующем разделе:

Упрощенные генерированные файлы конфигурации

При добавлении ссылки на службу в Visual Studio или использовании средства SvcUtil.exe создается файл конфигурации клиента. В предыдущих версиях WCF эти файлы конфигурации содержат значение каждого свойства привязки, даже если его значение является значением по умолчанию. В WCF 4.5 созданные файлы конфигурации содержат только те свойства привязки, которые имеют значение, отличное от значения по умолчанию.

Ниже приведен пример файла конфигурации, созданного 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.

<?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 Разработка

WCF теперь поддерживает разработку, в которой контракты идут первыми. Средство svcutil.exe имеет переключатель /serviceContract, который позволяет создавать контракты службы и данных из документа WSDL.

Добавление ссылки на службу из переносимого проекта подмножества

Проекты переносимого подмножества позволяют программистам сборок .NET поддерживать единую систему исходного кода и сборки, поддерживая несколько реализаций .NET (десктопные версии, Silverlight, Windows Phone и Xbox). Переносимые проекты подмножества ссылаются только на переносимые библиотеки .NET, которые являются сборками, которые можно использовать в любой реализации .NET. Интерфейс разработчика совпадает с добавлением ссылки на службу в любом другом клиентском приложении WCF. Для получения дополнительной информации см. раздел «Добавление служебной ссылки» в проекте переносимого подмножества.

Изменен режим совместимости ASP.NET по умолчанию

WCF предоставляет режим совместимости ASP.NET, чтобы предоставить разработчикам полный доступ к функциям в конвейере HTTP ASP.NET при написании служб WCF. Чтобы использовать этот режим, необходимо задать для атрибута aspNetCompatibilityEnabled значение true в <разделе serviceHostingEnvironment> web.config. Кроме того, любая служба в этой области приложения должна иметь свойство RequirementsMode в своем AspNetCompatibilityRequirementsAttribute установленным на Allowed или Required. По умолчанию AspNetCompatibilityRequirementsAttribute теперь установлено как Allowed, и шаблон приложения службы WCF по умолчанию устанавливает атрибут aspNetCompatibilityEnabled как true. Дополнительные сведения см. в статье "Новые возможности Windows Communication Foundation 4.5 " и служб WCF и ASP.NET.

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

  • Добавлена новая поддержка асинхронной потоковой передачи в WCF. Чтобы включить асинхронную потоковую передачу, добавьте DispatcherSynchronizationBehavior поведение конечной точки в узел службы и задайте для его свойства AsynchronousSendEnabled значение true. Это может повысить масштабируемость, когда служба отправляет потоковые сообщения нескольким клиентам, которые медленно читаются. WCF больше не блокирует один поток для каждого клиента и освобождает поток для обслуживания другого клиента.

  • Удалены ограничения, связанные с буферизацией сообщений при размещении службы IIS. В предыдущих версиях WCF при получении сообщения для службы, размещенной в IIS, которая использовала передачу сообщений потоковой передачи, ASP.NET будет буферировать все сообщение перед отправкой в WCF. Это приведет к большому потреблению памяти. Эта буферизация была удалена в .NET Framework 4.5, и теперь службы WCF, размещенные в IIS, могут начать обработку входящего потока до получения всего сообщения, тем самым обеспечивая истинную потоковую передачу. Это позволяет WCF немедленно реагировать на сообщения и обеспечивает улучшенную производительность. Кроме того, вам больше не нужно указывать значение для maxRequestLength, ASP.NET ограничение размера входящих запросов. Если это свойство задано, оно игнорируется. Дополнительные сведения об maxRequestLengthэлементе конфигурации httpRuntime< см. в разделе>. Вам по-прежнему потребуется настроить maxAllowedContentLength, дополнительные сведения см. в разделе "Ограничения запросов IIS".

Новые значения по умолчанию транспорта

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

Недвижимость Включено Новое значение по умолчанию Дополнительная информация
тайм-аут инициализации канала NetTcpBinding 30 секунд Это свойство определяет, сколько времени может занять tcp-подключение для проверки подлинности с помощью протокола Framing .NET. Клиенту необходимо отправить некоторые исходные данные, прежде чем сервер имеет достаточно сведений для выполнения проверки подлинности. Это время ожидания намеренно меньше, чем ReceiveTimeout (10 мин), чтобы вредоносные клиенты без аутентификации не занимали соединения с сервером на длительное время. Значение по умолчанию — 30 секунд. Дополнительная информация о ChannelInitializationTimeout
Очередь прослушивания NetTcpBinding 16 * число процессоров Это свойство уровня сокета описывает количество ожидающих запросов на прием в очередь. Если очередь соединений на прослушивание заполняется, новые запросы на сокеты будут отклонены. Дополнительная информация о ListenBacklog
maxPendingAccepts Элемент привязки транспортировки с ориентированием на соединение

SMSvcHost.exe
2 * число процессоров для транспорта

4 * число процессоров для SMSvcHost.exe
Это свойство ограничивает количество каналов, которые сервер может удерживать в ожидании обработки слушателем. Если значение MaxPendingAccepts слишком мало, будет небольшой интервал времени, в течение которого все каналы ожидания начали обслуживание подключений, но новые каналы не начали прослушивание. Соединение может поступить во время этого интервала и потерпит неудачу, поскольку на сервере его ничего не ждет. Это свойство можно настроить, задав свойству MaxPendingConnections большее число. Дополнительные сведения см. в MaxPendingAccepts и настройке службы обмена портами Net.TCP
maxPendingConnections Элемент привязки транспортировки с ориентированием на соединение 12 * число процессоров Это свойство определяет количество соединений, принятых транспортом, но еще не были обработаны диспетчером ServiceModel. Чтобы задать это значение, используйте привязку MaxConnections или элемент привязки maxOutboundConnectionsPerEndpoint. Дополнительная информация о MaxPendingConnections
receiveTimeout SMSvcHost.exe 30 секунд Это свойство задает время ожидания для чтения данных tcp-кадрирования и выполнения отправки подключений из базовых подключений. Это предназначено для ограничения времени, в течение которого служба SMSvcHost.exe удерживается для чтения данных преамбулы из входящего подключения. Дополнительные сведения см. в разделе "Настройка службы общего доступа к tcp-порту Net.TCP".

Замечание

Эти новые значения по умолчанию используются только при развертывании службы WCF на компьютере с .NET Framework 4.5. При развертывании той же службы на компьютере с .NET Framework 4.0 используются значения по умолчанию .NET Framework 4.0. В таких случаях рекомендуется явно настроить эти параметры.

XmlDictionaryReaderQuotas

XmlDictionaryReaderQuotas содержит настраиваемые значения квот для средств чтения словарей XML, которые ограничивают объем памяти, используемой кодировщиком при создании сообщения. Хотя эти квоты настраиваются, значения по умолчанию изменились, чтобы уменьшить вероятность того, что разработчику потребуется явно задать их. MaxReceivedMessageSize квота не была изменена, чтобы она по-прежнему могла ограничить потребление памяти, предотвращая необходимость решения проблемы сложности XmlDictionaryReaderQuotas. В следующей таблице показаны квоты, их новые значения по умолчанию и краткое описание того, для чего используется каждая квота.

Имя квоты Значение по умолчанию Описание
MaxArrayLength Int32.MaxValue Получает и задает максимальную допустимую длину массива. Эта квота ограничивает максимальный размер массива примитивов, возвращаемых средством чтения XML, включая массивы байтов. Эта квота не ограничивает потребление памяти в самом средстве чтения XML, но в любом компоненте, который использует средство чтения. Например, когда DataContractSerializer использует ридер, защищённый MaxArrayLength, он не десериализует массивы байтов, превышающие эту квоту.
MaxBytesPerRead Int32.MaxValue Возвращает и задает максимально допустимые байты, возвращаемые для каждого чтения. Эта квота ограничивает количество байтов, считываемых в одной операции чтения при чтении тега запуска элемента и его атрибутов. (В случае отсутствия потоковой передачи само имя элемента не учитывается в лимите квоты). Наличие слишком большого количества XML-атрибутов может использовать непропорциональное время обработки, так как имена атрибутов должны проверяться на уникальность. MaxBytesPerRead устраняет эту угрозу.
MaxDepth 128 узлов глубоко Эта квота ограничивает максимальную глубину вложенных элементов XML. MaxDepth взаимодействует с MaxBytesPerRead: средство чтения всегда хранит данные в памяти для текущего элемента и всех его предков, поэтому максимальное потребление памяти читателя пропорционально продукту этих двух параметров. При десериализации графа глубоко вложенных объектов десериализатор вынужден получить доступ ко всему стеку и выбросить неустранимое StackOverflowException. Прямая корреляция существует между вложением XML и вложением объектов как для DataContractSerializer, так и для XmlSerializer. MaxDepth используется для устранения этой угрозы.
MaxNameTableCharCount Int32.MaxValue Эта квота ограничивает максимальное количество символов, разрешенных в наборе имен. Таблица имен содержит определенные строки (например, пространства имен и префиксы), которые встречаются при обработке XML-документа. Так как эти строки буферизуются в памяти, эта квота используется для предотвращения чрезмерного буферизации при ожидании потоковой передачи.
MaxStringContentLength Int32.MaxValue Эта квота ограничивает максимальный размер строки, возвращаемой средством чтения XML. Эта квота не ограничивает потребление памяти в самом средстве чтения XML, но в компоненте, который использует средство чтения. Например, если DataContractSerializer использует средство чтения, защищенное с помощью MaxStringContentLength, оно не десериализует строки, большие, чем эта квота.

Это важно

Дополнительные сведения о защите данных см. в разделе "Безопасное использование XML" в разделе "Вопросы безопасности" для данных.

Замечание

Эти новые значения по умолчанию используются только при развертывании службы WCF на компьютере с .NET Framework 4.5. При развертывании той же службы на компьютере с .NET Framework 4.0 используются значения по умолчанию .NET Framework 4.0. В таких случаях рекомендуется явно настроить эти параметры.

Проверка конфигурации WCF

В рамках процесса сборки в Visual Studio теперь проверяются файлы конфигурации WCF. Список ошибок или предупреждений проверки отображается в Visual Studio, если проверка завершается ошибкой.

Подсказки редактора XML

Чтобы помочь новым и существующим разработчикам служб WCF настроить свои службы, редактор XML Visual Studio теперь предоставляет подсказки для каждого элемента конфигурации и его свойств, входящих в файл конфигурации службы.

Улучшения BasicHttpBinding

  1. Позволяет одной конечной точке WCF реагировать на различные режимы проверки подлинности.

  2. Позволяет службам WCF управлять параметрами безопасности через IIS.