Контракты маршрутизации
Контракты маршрутизации определяют схемы обмена сообщениями, которые может обрабатывать служба маршрутизации. Эти контракты являются бестиповыми, с их помощью служба может получать сообщение без набора знаний о схеме сообщения или действии. Благодаря этому служба маршрутизации может перенаправлять сообщения без дополнительной настройки под особенности маршрутизируемых сообщений.
Контракты маршрутизации
Поскольку служба маршрутизации принимает общий объект сообщения WCF, наиболее важным аспектом при выборе контракта является форма канала, который будет использоваться для связи с клиентами и серверами. При обработке сообщений служба маршрутизации использует симметричные циклы обработки сообщений, поэтому, как правило, форма входящего контракта должна быть такой же, как форма исходящего контракта. Однако есть случаи, когда диспетчер модели службы может изменять фигуры, например, когда диспетчер преобразует дуплексный канал в канал ответа на запрос или удаляет поддержку сеанса из канала, если он не требуется и не используется (то есть, когда sessionMode.Allowed, преобразует IInputSessionChannel в IInputSessionChannel).
Для поддержки этих циклов сообщений служба маршрутизации предоставляет контракты из пространства имен System.ServiceModel.Routing, которые должны использоваться при определении конечных точек службы, используемых службой маршрутизации. Эти контракты являются бестиповыми, что позволяет принимать любые типы сообщений или действия, а также позволяет службе маршрутизации обрабатывать сообщения без набора знаний их схемы. Дополнительные сведения о контрактах, используемых службой маршрутизации, см. в разделе "Контракты маршрутизации".
Контракты, предоставляемые службой маршрутизации, находятся в пространстве имен System.ServiceModel.Routing, они описаны в следующей таблице.
Contract | Фигура | Форма канала |
---|---|---|
ISimplexDatagramRouter | SessionMode = SessionMode.Allowed AsyncPattern = true IsOneWay = true |
IInputChannel —> IOutputChannel |
ISimplexSessionRouter | SessionMode = SessionMode.Required AsyncPattern = true IsOneWay = true |
IInputSessionChannel —> IOutputSessionChannel |
IRequestReplyRouter | SessionMode = SessionMode.Allowed AsyncPattern = true |
IReplyChannel -> IRequestChannel |
IDuplexSessionRouter | SessionMode=SessionMode.Required CallbackContract=typeof(ISimplexSession) AsyncPattern = true IsOneWay = true TransactionFlow(TransactionFlowOption.Allowed) |
IDuplexSessionChannel —> IDuplexSessionChannel |