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


Службы WCF и ASP.NET

В этом разделе рассматривается размещение служб Windows Communication Foundation (WCF) параллельно с ASP.NET и их размещение в режиме совместимости ASP.NET.

Размещение WCF параллельно с ASP.NET

Службы WCF, размещенные в службах IIS, могут быть расположены вместе с .ASPX страницами и веб-службами ASMX внутри единого домена приложений. ASP.NET предоставляет общие службы инфраструктуры, такие как управление appDomain и динамическая компиляция для WCF и среды выполнения ASP.NET HTTP. Конфигурация по умолчанию для WCF выполняется параллельно с ASP.NET.

Снимок экрана: службы WCF и ASP .NET: состояние общего доступа.

Среда выполнения HTTP ASP.NET обрабатывает ASP.NET запросы, но не участвует в обработке запросов, предназначенных для служб WCF, даже если эти службы размещаются в том же домене приложений, что и ASP.NET содержимое. Вместо этого модель службы WCF перехватывает сообщения, адресованные службам WCF, и направляет их через стек транспорта и канала WCF.

Результаты параллельной модели приведены следующим образом:

  • службы ASP.NET и WCF могут совместно использовать состояние AppDomain. Так как две платформы могут сосуществовать в одном домене приложений, WCF также может совместно использовать состояние AppDomain с 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-адресов, определённым в конфигурационном элементе <System.Web> авторизации. Эти параметры игнорируются для запросов WCF, если служба находится в пространстве URL-адресов, защищенном правилами авторизации URL-адресов ASP.NET.

    • Расширяемость HttpModule: инфраструктура размещения WCF перехватывает запросы WCF при возникновении события PostAuthenticateRequest и не возвращает обработку в конвейер HTTP ASP.NET. Модули, закодированные для перехвата запросов на последующих этапах конвейера, не перехватывают запросы WCF.

    • ASP.NET олицетворение: По умолчанию, WCF-запросы всегда выполняются с удостоверением процесса IIS, даже если в ASP.NET включено олицетворение с помощью параметра конфигурации <System.Web identity impersonate="true" />.

Эти ограничения применяются только к службам 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 предназначена для согласованного поведения в средах размещения и транспортах, часто существуют сценарии, в которых приложение не требует такой степени гибкости. Режим совместимости WCF ASP.NET подходит для сценариев, которые не требуют возможности размещения за пределами 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, могут быть защищены путем подключения списков управления доступом файловой системы (ACL) к SVC-файлу службы.

  • Настраиваемая авторизация 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.

Режим совместимости WCF ASP.NET включен на уровне приложения через следующую конфигурацию (расположенную в файле Web.config приложения):

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

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

Так как режим совместимости ASP.NET подразумевает семантику обработки запросов, которые по умолчанию отличаются от WCF, отдельные реализации служб могут контролировать, выполняются ли они внутри приложения, для которого включен режим совместимости ASP.NET. Службы могут использовать AspNetCompatibilityRequirementsAttribute, чтобы указать, поддерживают ли они режим совместимости ASP.NET. Значение по умолчанию для этого атрибута — Allowed.

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}

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

Параметр режима совместимости на уровне приложения [AspNetCompatibilityRequirementsMode]

Настройки
Наблюдаемый результат
aspNetCompatibilityEnabled = "true" Required Служба успешно активируется.
aspNetCompatibilityEnabled = "true" Allowed Служба успешно активируется.
aspNetCompatibilityEnabled = "true" NotAllowed Ошибка активации возникает, когда служба получает сообщение.
aspNetCompatibilityEnabled = "false" Required Ошибка активации возникает, когда служба получает сообщение.
aspNetCompatibilityEnabled = "false" Allowed Служба успешно активируется.
aspNetCompatibilityEnabled = "false" NotAllowed Служба успешно активируется.

Замечание

IIS 7.0 и WAS позволяют службам WCF обмениваться данными по протоколам, отличным от ПРОТОКОЛА HTTP. Однако службы WCF, работающие в приложениях с включенными ASP.NET режимом совместимости, не могут предоставлять конечные точки, отличные от HTTP. Такая конфигурация создает исключение активации, когда служба получает свое первое сообщение.

Дополнительные сведения о включении режима совместимости ASP.NET для служб WCF см. в AspNetCompatibilityRequirementsMode и в примере совместимости ASP.NET.

См. также