Службы WCF и ASP.NET
В данном разделе описано параллельное размещение служб Windows Communication Foundation (WCF) и ASP.NET и их размещение в режиме совместимости ASP.NET.
Параллельное размещение WCF и ASP.NET
Службы WCF, размещенные в службах IIS, могут располагаться на страницах .ASPX и в веб-службах ASMX внутри одного общего домена приложения. Платформа ASP.NET предоставляет общие службы инфраструктуры, такие как управление доменом приложения и динамическая компиляция как в WCF, так и в среде выполнения HTTP ASP.NET. Конфигурацией по умолчанию для WCF является параллельное размещение с ASP.NET.
Среда выполнения HTTP ASP.NET обрабатывает запросы ASP.NET, но не участвует в обработке запросов, предназначенных для служб WCF, несмотря на то что эти службы размещены в том же домене приложения, что и содержимое ASP.NET. Вместо этого модель службы WCF перехватывает сообщения, адресованные службам WCF, и направляет их через стек каналов или транспортный стек WCF.
Результаты использования параллельной модели представлены ниже.
ASP.NET и службы WCF могут совместно использовать состояние домена приложения. Поскольку две платформы могут совместно существовать в одном домене приложения, WCF также может использовать состояние домена приложения совместно с платформой ASP.NET (включая статические переменные, события и т. д.)
Службы WCF работают согласованно, независимо от среды размещения и транспорта. Среда выполнения HTTP ASP.NET преднамеренно связана со средой размещения IIS/ASP.NET и обменом данных по протоколу HTTP. И наоборот, WCF создана для согласованной работы в разных средах размещения (WCF работает согласованно как в пределах, так и за пределами IIS) и с использованием разных транспортов (служба, размещенная в IIS 7.0, работает согласованно во всех предоставляемых конечных точках, даже если некоторые из этих конечных точек используют протоколы, отличные от HTTP.)
В пределах домена приложения функции, реализуемые средой выполнения HTTP, применяются к содержимому ASP.NET, но не к WCF. Многие функции платформы приложений ASP.NET, характерные для HTTP, не применяются к службам WCF, размещенным в пределах домена приложения с содержимым ASP.NET. В примеры этих функций входит следующее.
HttpContext. Свойство Current всегда имеет значение null, если доступ осуществляется из службы WCF. Используйте вместо этого функцию RequestContext.
Авторизация на основе файла. Модель безопасности WCF не допускает применения списка управления доступом (ACL) к SVC-файлу службы при решении того, авторизирован ли запрос службы.
Авторизация URL-адреса на основе конфигурации. Аналогично, модель безопасности WCF не придерживается никаких правил авторизации на основе URL-адреса, указанных в элементе конфигурации <authorization> System.Web. Эти параметры не учитываются для запросов WCF, если служба находится в пространстве URL-адреса, защищенного правилами авторизации URL-адреса платформы ASP.NET.
Расширяемость HttpModule. Инфраструктура размещения WCF перехватывает запросы WCF, когда возникает событие PostAuthenticateRequest, и не возвращает обработку в конвейер HTTP ASP.NET. Модули, закодированные на перехват запросов на более поздних стадиях конвейера, не перехватывают запросы WCF.
Олицетворение ASP.NET. По умолчанию запросы WCF всегда выполняются как процессы IIS, даже если ASP.NET настроена на включение олицетворения с помощью параметра конфигурации <identity impersonate=”true” /> System.Web.
Эти ограничения применяются только к службам WCF, размещенным в приложении IIS. На поведение содержимого ASP.NET не влияет наличие WCF.
В приложениях WCF, требующих функциональность, традиционно предоставляемую конвейером HTTP, следует рассмотреть возможность использования эквивалентов WCF, независимых от среды размещения и транспорта.
OperationContext вместо HttpContext.
ServiceAuthorizationBehavior вместо авторизации на основе файла или URL-адреса ASP.NET.
IDispatchMessageInspector или пользовательские многоуровневые каналы вместо HTTP-модулей.
Олицетворение для каждой операции с использованием WCF вместо олицетворения System.Web.
Также можно рассмотреть выполнение служб в режиме совместимости ASP.NET WCF.
Размещение служб WCF в режиме совместимости ASP.NET
Несмотря на то что модель WCF создана для согласованной работы в разных средах размещения и с использованием разных транспортов, часто применяются сценарии, в которых приложению не требуется такая степень гибкости. Режим совместимости ASP.NET WCF подходит для сценариев, в которых не требуется возможность размещения за пределами IIS или взаимодействие по протоколам, отличным от HTTP, но в которых используются все функции платформы веб-приложений ASP.NET.
В отличие от параллельной конфигурации по умолчанию, в которой инфраструктура размещения WCF перехватывает сообщения WCF и направляет их из конвейера HTTP, службы WCF, выполняемые в режиме совместимости ASP.NET, принимают полное участие в жизненном цикле HTTP-запроса ASP.NET. В режиме совместимости службы WCF используют конвейер HTTP через реализацию IHttpHandler подобно тому, как выполняется обработка запросов для страниц ASPX и веб-служб ASMX. В результате WCF работает аналогично ASMX в отношении следующих функций ASP.NET.
Службы HttpContext: WCF, выполняемые в режиме совместимости ASP.NET, могут получать доступ к свойству Current и связанному с ним состоянию.
Авторизация на основе файла. Службы WCF, выполняемые в режиме совместимости ASP.NET, можно защитить, прикрепив к файлу .svc службы системный список управления доступом к файлу (ACL).
Настраиваемая авторизация URL-адреса. Правила авторизации URL-адреса ASP.NET применяются к запросам WCF, если служба WCF выполняется в режиме совместимости ASP.NET.
Расширяемость HttpModuleCollection. Поскольку службы WCF, выполняемые в режиме совместимости ASP.NET, принимают полное участие в жизненном цикле HTTP-запроса ASP.NET, любой HTTP-модуль, настроенный в конвейере HTTP, может выполнять операции с запросами WCF как перед вызовом службы, так и после него.
Олицетворение ASP.NET. Службы WCF выполняются с использованием текущей идентификации олицетворяемого потока ASP.NET, которая может отличаться от идентификации процесса IIS, если для этого приложения включено олицетворение ASP.NET. Если для определенной операции службы включено и олицетворение ASP.NET, и олицетворение WCF, реализация службы в конечном счете выполняется с использованием идентификации, полученной от WCF.
Режим совместимости ASP.NET WCF включается на уровне приложения с помощью следующей конфигурации (расположенной в файле Web.config приложения.)
<system.serviceModel> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> </system.serviceModel>
По умолчанию задается значение "false", если оно не указано. Если установить значение "true", все службы WCF, выполняемые в приложении, будут выполняться в режиме совместимости ASP.NET.
Поскольку режим совместимости ASP.NET подразумевает семантику обработки запросов, существенно отличающуюся от WCF по умолчанию, в реализации отдельных служб имеется возможность управления тем, выполняются ли они внутри приложения, для которого включен режим совместимости ASP.NET. Службы могут использовать атрибут AspNetCompatibilityRequirementsAttribute для указания, поддерживают ли они режим совместимости ASP.NET.
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}
В следующей таблице показано взаимодействие параметра режима совместимости на уровне приложения с заданным уровнем поддержки отдельной службы.
Параметр режима совместимости на уровне приложения | [AspNetCompatibilityRequirementsMode] Параметр | Полученный результат |
---|---|---|
aspNetCompatibilityEnabled = "true" |
Служба включается успешно. |
|
aspNetCompatibilityEnabled = "true" |
Служба включается успешно. |
|
aspNetCompatibilityEnabled = "true" |
При получении службой сообщения возникает ошибка активации. |
|
aspNetCompatibilityEnabled = "false" |
Required |
При получении службой сообщения возникает ошибка активации. |
aspNetCompatibilityEnabled = "false" |
Allowed |
Служба включается успешно. |
aspNetCompatibilityEnabled = "false" |
NotAllowed |
Служба включается успешно. |
Примечание |
---|
IIS 7.0 и WAS позволяют службам WCF взаимодействовать по протоколам, отличным от HTTP. Однако службам WCF, выполняемым в приложениях с включенным режимом совместимости ASP.NET, не разрешено предоставлять конечные точки, работающие по протоколу, отличному от HTTP. В такой конфигурации создается исключение активации, когда служба получает первое сообщение. |
Дополнительные сведения о включении режима совместимости ASP.NET для служб WCF см. в разделе AspNetCompatibilityRequirementsMode.
См. также
Справочник
AspNetCompatibilityRequirementsAttribute