wcf part 1
TRANSCRIPT
Венжик Игорь
Что такое SOA
Архитектура WCF
WSDL XSD SOAP
Контракты (Contracts)
Привязки (Bindings)
Поведение (Behaviors)
Хостинг (Hosting)
Безопасность
Расширяемость WCF
SOAP vs REST
Маршрутизация. Масштабируемость. Отказоустойчивость
Что такое SOA
Архитектура WCF
Первый WCF сервис
Слабое связывание (Loose coupling)
Предсказуемость (Formal contract)
Абстрагирование от реализации(Abstraction)
Автономность (Autonomy)
Повторное использование (Reusability)
Принцип композиции (Composability)
Открытость (Discoverability)
Клиент Сервис
( + )
Сервис2
( * )
Сервис3
( / )
a+b
a+b*c
a/b
Четкие границыПересечение границ – четко определено
Пересечение границ стоит ресурсов
Сервисы самостоятельныМы должны понимать что используемый нами сервис будет развиваться и у нас нет контроля над этим
Сервисы управляются и разрабатываются независимо
Сервис, который мы используем может быт недоступен!
Сервисы предоставляют схему и контракт, но не кодСервисы взаимодействуют по контрактам, которые не меняются.
Сервисы предоставляют только контракт, реализация может меняться и недолжна нас беспокоить
Binary .NET-.NET
Communication
Distributed
Transactions
WS-* Specifications
Queued Messaging
Interoperable Web
Services
RESTful
Communication
.NET Remoting
Enterprise Services
Web Services
Enhancements
System.Messaging
ASMX
System.Net Win
do
ws C
om
mu
nic
atio
n
Fo
un
da
tio
n
Клиент Сервис
СообщениеABC A B C
Адрес
(Где)
Привязки
(Как)
Контракт
(Что)
Конечная точка
(Endpoint)
Клиент Сервис
СообщениеABC A B C
A B C
Адрес Привязки Контракт
(Где) (Как) (Что)
Клиент Сервис
СообщениеABC A B C
A B C
Bv Bv
Bv
Клиент Сервис
СообщениеABC A B C
A B C
Metadata
Bv Bv
Bv
Клиент Сервис
СообщениеABC A B C
A B C
Metadata
Bv Bv
Bv Bv
ProxyServiceHost<T>()
Hosting Environments
WAS IIS .exeWindowsService
DllHost
Bin
din
g(К
ак?
)
Address (Где?)
Contract (Что?)
Просторы интернета
WSDL XSD SOAP
Контракты (Contracts)
Привязки (Bindings)
Поведение (Behaviors)
Хостинг (Hosting)
WSDL – это язык описания веб-сервисов, основанный на языке XML
WSDL документ состоит из трех логических частей
Определения типов данных – отправляемые и получаемые сервисом XML сообщений(DataContract)
Операции сервиса – список операций, которые может предоставить сервис (ServiceContract)
Связывание сервисов – способ общения с сервисом (Binding)
http://w3.org/TR/wsdl
Конверт
Заголовок
Action
To
From
Reply-To, Error
Тело
SOAP: Envelope
SOAP: Header
SOAP: Body
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<MessageID>1A01E8FE1C4F4451BFA9B6B13DF647FA</MessageID>
<Action>http://tscrm.com/GetStockPrice</Action>
</soap:Header>
<soap:Body>
<m:GetStockPrice xmlns:m="...">
<m:StockName>IBM</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
<soap:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header/>
<soap:Body>
<GetStockPriceResponse xmlns="http://tempuri.org/">
<GetStockPriceResult>10 000</GetStockPriceResult>
</GetStockPriceResponse>
</soap:Body>
</soap:Envelope>
• Описывает операции, выполняемые сервисом
• CLR тип соответствует WSDLService
• Структура данных
• CLR тип соответствует XSDData
• Структура сообщений
• CLR тип соответствует SOAP сообщению
Message
[ServiceContract]
public interface ICalculator
{
[OperationContract]
ComplexProblem SolveProblem (ComplexProblem p);
}
SessionMode
NotAllowed
Allowed (default)
Required
Name & Namespace
ProtectionLevel
None
Sign
EncryptAndSign
CallbackContract
[ServiceContract(CallbackContract=
typeof(ICalculatorResults)]
public interface ICalculatorProblems {
[OperationContract(IsOneWay=true)]
void SolveProblem (ComplexProblem p);
}
public interface ICalculatorResults {
[OperationContract(IsOneWay=true)]
void Results(ComplexProblem p);
}
IsOneWay
IsInitiating & IsTerminating
Name
AsyncPattern
Action
ReplyAction
ProtectionLevel & HasProtectionLevel
Дуплексная связь
[DataContract]
public class Player {
[DataMember] public string Name = “Anonymous”;[DataMember]public int Age { get; set; }
}
[CollectionDataContract(Name = “Players",
ItemName = “Player"))]
public class Team : List<Player> {
[DataMember]
public string Name { get; private set; }
}
[MessageContract]
public class ComplexProblem
{
[MessageHeader] public string operation;
[MessageBody]public ComplexNumber n1;
[MessageBody]public ComplexNumber n2;
[MessageBody]public ComplexNumber solution;
// Constructors…
}
Контракт данных
[ServiceContract]Методы сервиса отмечаем атрибутом [OperationContract]
На уровне контракта сервиса можно затребовать поддержку сессий (SessionMode)
Можем указать каким методом начитать взаимодействие с сервисом (IsInitiating) и указать каким методом разрывать соединение (IsTerminating)
[DataContract] или [CollectionDataContract]Помним что контракты данных подчиняться общим правилам сериализации. В контракте не может быть циклических ссылок
У всех свойств отмеченных атрибутом [DataMember] должны присутствовать оба аксессора get и set
Если присутствие одного из аксессоров get или setпротиворечит бизнес логике, его можно сделать приватным
[MessageContract]Если метод сервиса принимает контракт сообщения, у него не может быть дополнительных параметров
Транспорт – определяет транспортный протоколобмена сообщениями (Http, Tcp, …)
Кодирование – определяет используемый тип кодирования сообщений
Текст (xml, json, …)
Бинарный
Другие протоколыБезопасность
Гарантированная доставка сообщения
Поддержка транзакций
Привязки — объекты, используемые для задания
сведений о связи, необходимых для подключения к
конечной точке сервиса
Транспорт Кодировка Security Reliability Протокол
Pipes
MSMQ
Custom
HTTP Text
TCP Binary
MTOM
Custom
Custom Custom
WS-* WS-* WS-*
Custom
WS-* WS-* WS-*HTTP TextTCP Binary
NP = Named Pipes
T = Transport Security
S = WS-Security
O = One-Way Only
BasicHttpBinding
WsHttpBinding
WsDualHttpBinding
NetTcpBinding
NetNamedPipesBinding
NetMsmqBinding
Http
WS
WS
T
TS
TS
TS
TS
TS
O
O
NetPeerTcpBinding TS
BP
Http
Http
Tcp
NP
MSMQ
P2P
<?xml version="1.0" encoding="utf-8" ?>
<configuration">
<system.serviceModel>
<services>
<service type="CalculatorService">
<endpoint address=“http://localhost/calculator"
binding="basicHttpBinding"
contractType="ICalculator" />
</service>
</services>
</system.serviceModel>
</configuration>
<endpoint address=“http://localhost/calculator"binding="basicHttpBinding"bindingConfiguration="Binding1"contractType="ICalculator" />
<bindings>
<basicHttpBinding>
<binding name="Binding1“ messageEncoding="Text"
textEncoding="utf-8" transferMode="Buffered">
<security mode="Message">
<transport clientCredentialType="None"/>
<message clientCredentialType="UserName“ />
</security>
</binding>
</basicHttpBinding>
</bindings>
<bindings><basicHttpBinding>
<binding name=""
maxReceivedMessageSize="9999999"><readerQuotas maxArrayLength="9999999"/>
</binding></basicHttpBinding>
</bindings>
<endpoint address=“http://localhost/calculator"binding="basicHttpBinding"bindingConfiguration=""contractType="ICalculator" />
<protocolMapping><add scheme="http" binding="basicHttpBinding"/><add scheme="net.tcp" binding="netTcpBinding"/><add scheme="net.pipe" binding="netNamedPipeBinding"/><add scheme="net.msmq" binding="netMsmqBinding"/>
</protocolMapping>
<protocolMapping><add scheme="http" binding="basicHttpBinding"/><add scheme="net.tcp" binding="netTcpBinding"/>
</protocolMapping>
<protocolMapping><clear scheme="http" /><add scheme="http" binding="customBinding"
bindingConfiguration="binaryHttp" /></protocolMapping>
<bindings><customBinding><binding name="binaryHttp">
<binaryMessageEncoding/><httpTransport/>
</binding></customBinding>
</bindings>
Поведение сервиса может быть настроено как в коде сервиса так и в конфигурационном файле
Атрибутом ServiceBehavior может быть отмечен только класс, который инкапсулирует в себе весь функционал сервиса
Основные параметрыAddressFilterMode
AutomaticSessionShutdown
ReleaseServiceInstanceOnTransactionComplete
TransactionIsolationLevel
IncludeExceptionDetailInFaults
Service
InstanceContextMode ConcurrencyMode
PerSession
PerCall
Single
Single
Reentrant
Multiple
PerSession SingleSingle Multiple
Поведение операций может задаваться только в коде
Атрибутом может быть отмечен только метод конкретного класса реализующего контракт
Основные параметрыImpersonation (олицетворение)
TransactionAutoComplete
TransactionScopeRequired
ReleaseInstanceModeNone
BeforeCall
AfterCall
BeforeAndAfterCall
[ServiceBehavior(InstanceContextMode =
InstanceContextMode.Single,ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service : IService {
[OperationBehavior(ReleaseInstanceMode =
ReleaseInstanceMode.AfterCall)]public DateTime GetCurrentDate() {
return DateTime.Now;}
Self-hosting
Console Application
WinForm Application
WPF Application
Internet Information Services (IIS)
Separate (Statealone)
ASP Application
Windows Service
Http Tcp Named Pipes MSMQ P2P
Console App
WinForm App
WPF App
Windows Service
Web server IIS6
Web server IIS7
Вопросы?Пожелания?