Skip to content
February 3, 2012 / ahriman hpc mode

[Перевод] Что нового в WCF 4.5? Улучшенный стриминг в IIS

Оглавление:

1. Что нового в WCF 4.5? Начнём с конфигурации WCF
2. Что нового в WCF 4.5? Один WSDL-файл.
3. Что нового в WCF 4.5? Подсказки конфигурации и intellisense в файлах конфигурации
4. Что нового в WCF 4.5? Проверки конфигурации
5. Что нового в WCF 4.5? Поддержка множественной аутентификации на одну точку входа в IIS
6. Что нового в WCF 4.5? Точка входа HTTPS для IIS
7. Что нового в WCF 4.5? BasicHttpsBinding
8. Что нового в WCF 4.5? Изменения в режиме совместимости ASP.NET
9. Что нового в WCF 4.5? Улучшенный стриминг в IIS

Продолжаем обсуждать новые фичи WCF 4.5.

Это девятый пост в серии о WCF 4.5. На этот раз мы поговорим об улучшенных возможностях стриминга WCF, размещенного в IIS.

Если вы когда-нибудь пробовали создать сервис WCF, использующий стриминг (например, для загрузки файла) и размещать его в IIS, вы могли заметить странное поведение сервиса – выглядело так, как будто WCF запаздывало с принятием запроса, так, как будто все полностью загружалось в память и потом передавалось в WCF. Это разве стриминг? Или, скорее, буферизация? И то и другое.

Когда вы размещаете сервис WCF в IIS, вы получаете немного ASP.NET pipeline, даже если вы не используете режим совместимости ASP.NET, что описано в документации на MSDN WCF Services and ASP.NET (часть про событие PostAuthenticateRequest). В.NET 4 есть недоработка дизайна ASP.NET, которая приводила к тому, что запросы к WCF буферизовались в ASP.NET, что приводило к серьезным побочным эффектам:

1. Латентность между временем, когда сообщение получалось ASP.NET, и временем, когда метод сервиса WCF реально вызывался.

2. Потребление памяти из-за буферизации – точное количество потребляемой памяти основывалось на размере посылаемых клиентом сообщений, но могло быть даже в несколько сотен мегабайт, если вы увеличивали MaxRequestLength вASP.NET, MaxAllowedContentLength в IIS 7, и, конечно, MaxReceivedMessageSize и MaxBufferSize в WCF.

3. Когда ASP.NET буферизовал запрос, он использовал одновременно память и диск. Настройка конфигурации ASP.NET requestLengthDiskThreshold инициировало момент начала использования диска. Если вы загружали множество файлов в WCF за один раз, вы могли видеть некоторые задержки из-за записи файлов на диск одновременно. Кстати, файлы записывались в папку upload во временной папке веб-приложения (c:\windows\Microsoft.NET\Framework\vX.X.XXXX\Temporary ASP.NET Files\) и удалялись после обработки запроса.

Чтобы продемонстрировать это поведение, я создал приложение, загружающее файл размером 500Мб в сервис WCF, размещенный в IIS и настроенный на стриминг-запросы (вы можете скачать решение здесь). Вывод показывает некоторую информацию о времени, которое было затрачено сервисом на принятие и обработку запросов, а также потребленную память:

1 Client started upload on 17/01/2012 19:03:25
2 Available memory before starting is: 2701MB
3 Client finished upload on 17/01/2012 19:03:44
4 Available memory after finishing is: 2699MB
5 Available memory on ASP.NET is: 2701MB
6 ASP.NET received upload at: 17/01/2012 19:03:28
7 Available memory on WCF is: 2122MB
8 WCF started receiving file at: 17/01/2012 19:03:38
9 WCF finished receiving file at: 17/01/2012 19:03:43
File size is: 524288000
Press any key to continue . . .

Что нужно отметить:

1. Client started / Client finished (line 1+3) – полное время клиента на ожидание сервиса – 19 секунд, что включает в себя время загрузки, буферизации ASP.NET и обработку потока WCF.

2. ASP.NET начал принимать поток спустя 3 секунды после его отправки клиентом (строка 6).

3. WCF начал принимать поток спустя 10 секунд после начала его принятия ASP.NET, и спустя 13 секунд после его отправки клиентом (строка 8). В общем у WCF заняло 5 секунд на принятие всего потока от ASP.NET (строка 8+9)

4. Перед отправкой сообщения клиентом доступной памяти на машине было 2701Мб, столько же было после принятия сообщения ASP.NET. Ко времени принятия запроса WCF и начала его обработки доступной памяти осталось 2122Мб – то есть, всего было потреблено памяти 580Мб (строки 2,5,7) .

5. Временная папка ASP.NET:

clip_image001

Примечание: для показа информации ASP.NET я использовал режим совместимости. Вы можете выключить его в коде, если вы хотите убедиться, что проблема еще актуальна при неиспользовании режима совместимости (обратите внимание на различия между временем отправки запроса клиентом и временем начала реальной обработки запроса WCF – должна быть большая задержка)

Мы увидели, что WCF 4 не очень хорошо обрабатывает стриминг-контент с IIS, но что насчет WCF 4.5? Что изменилось?

В WCF 4.5 такого просто не происходит – в .NET 4.5, ASP.NET не буферизует запросы, а просто перенаправляет их напрямую в WCF, поэтому у нас нет ни задержки, ни потребления памяти, ни использования диска.

Доказательства? Я запустил код в Windows Server 8 с WCF 4.5 в IIS. Я использовал меньший размер файла (200Мб), так как использовал виртуальную машину с меньшим количеством памяти, однако можно четко увидеть различие:

1 Client started upload on 11/27/2011 7:23:18 AM
2 Available memory before starting is: 942MB
3 Client finished upload on 11/27/2011 7:23:46 AM
4 Available memory after finishing is: 942MB
5 Available memory on ASP.NET is: 941MB
6 ASP.NET received upload at: 11/27/2011 7:23:20 AM
7 Available memory on WCF is: 942MB
8 WCF started receiving file at: 11/27/2011 7:23:20 AM
9 WCF finished receiving file at: 11/27/2011 7:23:46 AM
File size is: 209715200
Press any key to continue . . .

Перво-наперво: потребление памяти не изменилось в течение выполнения – оставалось четко на ~942Мб (строки 2,4,5,7).

WCF приняло запрос в то же время, когда его принял ASP.NET (строки 6,8), то есть через 2 секунды после отправки его клиентом (что касается задержки).

А, так как ASP.NET напрямую перенаправил поток в WCF, не создавался временный файл!

Поэтому, раз вы это имеете – используйте стриминг в WCF 4.5 в IIS.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: