WCF Part 1

Post on 12-Jul-2015

343 views 0 download

Transcript of WCF Part 1

Венжик Игорь

Что такое 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

Вопросы?Пожелания?