1. МАИ, каф 806, Сети ЭВМ
WINDOWS COMMUNICATION FOUNDATION
1
2. МАИ, каф 806, Сети ЭВМ
Windows Communication FoundationSOA
SOA (service oriented architecture) это стиль программирования, где программы представляются в виде набора модулей, называемых сервисами. Сервисы, это группы методов, которые объединены общим набором решаемых требований или целей.
Основные принципы SOA
Границы определены явносервис работает в процессе отделенном от клиента, вызвать сервис можно зная его адрес и контракт.
Сервисы являются автономнымиработа одного сервиса не зависит от поведения другого
Сервисы описываются схемами и контрактами (а не классами) сервисы должны быть кросс-платформенными, поэтому публикуются только описания сервисов а не программный код
Совместимость сервисов базируется на policyнаборе правил, определяющих как обрабатывать сообщения
2
3. МАИ, каф 806, Сети ЭВМ
Windows Communication FoundationREST (Representational State Transfer)
REST —это не стандарт и не спецификация, а архитектурный стиль, выстроенный на существующих, хорошо известных и контролируемых консорциумом W3C стандартах, таких, как HTTP, URI (Uniform Resource Identifier), XML и RDF (Resource Description Format).
В REST-сервисах акцент сделан на доступ к ресурсам, а не на исполнение удаленных сервисов; в этом их кардинальное отличие от SOAP-сервисов. Если SOAP-клиенты запрашивают выполнение действия на сервере, то REST-клиенты попросту требуют сам ресурс
Наипростейший REST-сервис можно реализовать за несколько минут —статичный XML- файл, возвращаемый Web-сервисом, это технически и есть REST-сервис, ведь XML-данные запрашивались через HTTP. Это вряд ли может стать оптимальным способом построения вашей сервисной инфраструктуры, но для статичных или редко меняющихся ресурсов такая возможность весьма привлекательна. 3
4. МАИ, каф 806, Сети ЭВМ
Популярность различных подходов к построению API
4
5. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundationструктура сервиса
5
6. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundationтехнологии/xml
XML –это иерархический, текстовый язык разметки, предоставляющий стандартный способ для представления метаданных в понятном для человека и компьютера виде.
Для ссылок на другие документы в XMLиспользуются URI
Namespace используется для уникальной идентификации частей XML документа
6
<?xml version=‘1.0’ encoding=‘utf-8’?> <!--A collection of Media Items --> <Collection xmlns="http://example.com/schemas/mediacollection"> <Owner>Janine Labrune</Owner> <Name>Janine’s Media Collection</Name> <Item Media_Type="book"> <Title>The Joy of Rutabagas</Title> <Author> <FirstName>Karl</FirstName> <LastName>Jablonski</LastName> </Author> </Item> <Item Media_Type="video"> <Title>Growing Rutabagas as Pets</Title> <Length>35</Length> <Author> <FirstName>Maria</FirstName> <LastName>Anders</LastName> </Author> </Item> </Collection>
<p:payload xmlns:p="http://example.com/payload"> <p:owner name="tim" /> <p:text>Payload text</p:text> </p:payload>
7. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundationтехнологии/xml schemas
Схемы –это XML документы, которые описывают структуру типов данных и их свойства. Обычно используется XSD (schema definition language).
7
<xsd:schema xmlns="http://example.com/schemas/mediacollection" targetNamespace="http://example.com/schemas/mediacollection" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xsd:element name="Collection"> <xsd:complexType> <xsd:sequence> <xsd:element name="Owner" minOccurs="1" type="xsd:string" /> <xsd:element name="Name" minOccurs="1" type="xsd:string" /> <xsd:element name="Item" minOccurs="0" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="Title" minOccurs="1" type="xsd:string" /> <xsd:element name="Length" minOccurs="0" type="xsd:int" /> <xsd:element name="Author" minOccurs="0" maxOccurs="1"> <xsd:complexType> <xsd:sequence> <xsd:element name="FirstName" minOccurs="0" maxOccurs="1" type="xsd:string" /> <xsd:element name="LastName" minOccurs="0" maxOccurs="1" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="Media_Type" type="xsd:string" /> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
8. МАИ, каф 806, Сети ЭВМ 8
Windows Communication Foundationтехнологии/wsdl [1/2]
WSDL –язык описания веб-сервиса.
WSDL состоит из двух частей:
Абстрактной, описывающей структуру данных и методов веб-сервиса.
Конкретной, описывающей, как данный веб- сервис может быть вызван.
Элементы WSDL
Types–описывает типы данных, передаваемые и получаемые веб-сервисом.
Message –описывает сообщения, передаваемые по сети при вызове веб- сервисов.
PortType–абстрактное описание веб- сервиса. Состоит из описания набора операций, которые могут иметь как входные так и выходные сообщения.
Binding–конкретное описание PortType, с указанием протокола, по которому можно вызвать данный сервис.
Service–конкретное описание веб-сервиса, которое указывает по какому адресу может быть вызван тот или иной Binding.
10. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundationтехнологии/ws-inspection
Способ описания сервисов, предоставляемых сайтом. Представляет собой набор указателей на описание сервисов(http://msdn.microsoft.com/en-us/library/ms951237.aspx).
10
<?xml version="1.0"?>
<inspection xmlns="http://schemas.xmlsoap.org/ws/2001/10/inspection/"
xmlns:wsiluddi="http://schemas.xmlsoap.org/ws/2001/10/inspection/uddi/">
<service>
<abstract>A stock quote service with two descriptions</abstract>
<description referencedNamespace="http://schemas.xmlsoap.org/wsdl/"
location="http://example.com/stockquote.wsdl"/>
<description referencedNamespace="urn:uddi-org:api">
<wsiluddi:serviceDescription location="http://www.example.com/uddi/inquiryapi">
<wsiluddi:serviceKey>4FA28580-5C39-11D5-9FCF-BB3200333F79</wsiluddi:serviceKey>
</wsiluddi:serviceDescription>
</description>
</service>
<service>
<description referencedNamespace="http://schemas.xmlsoap.org/wsdl/"
location="ftp://anotherexample.com/tools/calculator.wsdl"/>
</service>
<link referencedNamespace="http://schemas.xmlsoap.org/ws/2001/10/inspection/"
location="http://example.com/moreservices.wsil"/>
</inspection>
11. МАИ, каф 806, Сети ЭВМ 11
Windows Communication Foundationтехнологии/soap
SimpleObjectAccessProtocol–протокол передачи данных на базе XML. Данные передаются с помощью протокола HTTP.
Структура SOAP сообщения соответствует WSDL описанию веб- сервиса.
Примерзапроса
<?xmlversion="1.0" encoding="utf-8" ?>
<soap:Envelopexmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<HelloWorldxmlns="http://tempuri.org/"></HelloWorld>
</soap:Body>
</soap:Envelope>
Примерответа
<?xmlversion="1.0" encoding="utf-8" ?>
<soap:Envelopexmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<HelloWorldResponsexmlns="http://tempuri.org/">
<HelloWorldResult>Hello World! </HelloWorldResult>
</HelloWorldResponse>
</soap:Body>
</soap:Envelope>
12. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundationтехнологии/ws-addressing
WS-Addressing заменила собой спецификацию WS-Routing. WS-Addressing включает в себя механизм для идентификации сообщений (MessageID), определения получателя (To) и объекта, которому должен быть послан ответ (ReplyTo).
Этот механизм встроен в заголовок SOAP и удлиняет входящие, исходящие сообщения и сообщения об ошибках внутри элемента, определяющего тип порта WSDL с помощью атрибута Action. 12
14. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundationпаттерны обмена сообщениями/запрос-ответ
Самый распространненый паттерн. Клиент запрашивает информацию отправкой запроса на сервер и ожидает ответное сообщений от сервера.
Клиент ждет ответа не более чем заранее определенное время (timeout)
В случае возникновения исключения посылается сообщение с описанием ошибки.
WCF поддерживает описания удаленных интерфейсов, путем применения атрибутов
[ServiceContract] к .NET интерфейсам
[OperationContract] к методам интерфейса
14
15. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundationпаттерны обмена сообщениями/one-way
Сообщения посылаются от клиента к серверу в одном направлении.
Сервер просто обрабатывает сообщения и не отправляет клиенту ответа или уведомления об обработке сообщения.
Данный паттерн позволяет работать ассинхронно.
С помощью данного паттерна можно применять промежуточное по для отправки сообщений, такое как MSMQ.
15
16. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundationпаттерны обмена сообщениями/duplex
Данный паттерн позволяет серверу посылать дополнительные запросы в сторону клиента в момент выполнения обработки основного запроса.
Фактически клиент так же выступает в роли сервера, для выполнения call-back операций.
В .NET есть возможность указать тип Call-Back интерфейса на уровне [Service Contract]
В WCF есть специальные типы binding, которые поддерживают call-back соединения.
16
17. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundationпаттерны обмена сообщениями/streaming
Данный паттерн применяется в случае если необходимо передать большой объем информации от сервера к клиенту (или наоборот).
Информация считывается из файла или базы данных по кускам и передается в сеть.
Отправитель сам определяет когда закончить передачу данных (какой блок является финальным).
17
18. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundationработа с сообщениями
Message RoutingНачиная с WCF 4.0 есть поддержка перенаправления сообщений, базируясь на их содержании, с помощью специальных классов, переопределяющих интерфейсы из System.ServiceModel.Routing
Protocol BindingВ WCF 4.0 есть средства приведения протокола (чтением данных из протокола источника и записью в протокол получатель).
Message FiltersСуществую средства, которые позволяют описывать какое сообщение каким сервисом должно обрабатываться (Xpath, по телу сообщения)
Backup Endpoint
Multicast BehaviourРеализуется с помощью фильтров. Одно сообщение посылается сразу всем сервисам, с подходдящим фильтром.
Discovery (WS-Discovery)
Intercepting FiltersПозволяет встраивать логику перед или после обработки основного вызова
Context Objects
18
19. МАИ, каф 806, Сети ЭВМ 19
Windows Communication Foundation контракты
Контракт –определяет функциональность, предоставляемую службой и функциональность, которая может быть использованна клиентом.
Типы контрактов
Контракты данных –определяет данные, принимаемые и возвращаемые службой.
Контракты службы –используется для определения интерфейса службы;
Контракты сообщений –в случае если требуется описывает поведение сообщений, передаваемых при взаимодействии со службой.
20. МАИ, каф 806, Сети ЭВМ 20
Windows Communication Foundation контракты служб[1/2]
Определяет операции, которые может выполнить служба.
1.[ServiceContract()]
2.public interface IMyService
3.{
4.[OperationContract]
5.OutputObject doAction(InputObject parameter);
6.}
Свойства ServiceContract
ConfigurationName –имя конфигурации службы в конфигурационном файле
CallbackContract–используется для дуплексного обмена (см. далее)
Name–определяет имя элемента portType
Namespace –определяет пространство имен для portType
SessionMode –управление сессиями
ProtectionLevel–управление защитой коммуникаций
21. МАИ, каф 806, Сети ЭВМ 21
Windows Communication Foundation контрактыслужб [2/2]
Свойства OperationContract
Action –Используется для установки соответствия имен операций и SOAPсообщений
ReplyAction–то же самое что и Action но для сообщений-ответов
AsyncPattern–используется для асинхронного обмена (BeginAsync, EndAsync)
IsInitiating–Операция инициирующая сеанс
IsTerminating–Операция завершающая сеанс
IsOneWay–Клиент не должден ждать результата от сервиса
Name–Имя операции (по умолчанию равно имени метода)
ProtectionLevel-управление защитой коммуникаций
22. МАИ, каф 806, Сети ЭВМ 22
Windows Communication Foundation контракты данных
Пример
1.[DataContract]
2.public class OutputObject
3.{
4.string message;
5.[DataMember]
6.public string Message
7.{
8.get { return message; }
9.set { message = value; }
10.}
11.}
Свойства DataMember
Name –служит для изменения имени атрибута
Order–определяет порядок сериализации атрибутов
IsRequired–элемент обязателен для сериализации (по умолчанию не обязательны)
EmitDefaultValue-необходимость передачи значения по умолчанию для поля
23. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundation контракты данных/пример
[DataContract(
Name="PriceCalculationRequest", Namespace=
"http://schemas.datacontract.org/2004/07/
MyScheme")]
public class PriceReq
{
[DataMember(Name="PickupDate",Order=1, IsRequired=true )]
private DateTimeFromDate{ get; set; }
[DataMember(Name= "ReturnDate", Order = 3)]
public DateTimeToDate{ get; set; }
[DataMember( Order = 2)]
public string PickupLocation{ get; set; }
[DataMember(Order= 4)]
public string ReturnLocation{ get; set; }
public string CarType{ get; set; }
}
<xs:complexTypename="PriceCalculationRequest" >
<xs:sequence>
<xs:elementminOccurs="0" name="PickupDate" type="xs:dateTime" / >
<xs:elementminOccurs="0" name="PickupLocation"
nillable="true" type="xs:string" / >
<xs:elementminOccurs="0" name="ReturnDate" type="xs:dateTime" / >
<xs:elementminOccurs="0" name="ReturnLocation"
nillable="true" type="xs:string" / >
</xs:sequence>
</xs:complexType>
23
24. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundation контракты данных/наследование
Описание на уровне контракта данных, то какие объекты могут передаваться:
[DataContract]
[KnownType(typeof(PriceCalculationResponseDetailed))]
public class PriceCalculationResponse{
[DataMember]
public double Price { get; set; }}
Описание на уровне метода
[OperationContract]
[ServiceKnownType(typeof(PriceCalculationResponseDetailed))]
PriceCalculationResponse CalculatePrice(PriceCalculationRequest request);
Описание на уровне сервиса
[OperationContract]
[ServiceKnownType(typeof(PriceCalculationResponseDetailed))]
PriceCalculationResponse CalculatePrice(PriceCalculationRequest request);
Динамическое описание
[DataContract]
[KnownType("GetTypes")]
public class PriceCalculationResponse{
static Type[] GetTypes(){Type[] t = { typeof(PriceCalculationResponseDetailed) };return t; }
}
24
25. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundation контракты данных/версии
При модификации программы контракты данных могут менять свою структуру. Для того что бы корректно отрабатывать данную ситуацию необходимо на уровне базового объекта определить возможность расширения:
[DataContract]
public class PriceCalculationResponse :IExtensibleDataObject
{
public ExtensionDataObjectExtensionData { get; set; }
[DataMember]
public int Flag { get; set; }
[DataMember]
public double Price { get; set; }
[DataMember]
public string Currency { get; set; }
}
25
26. МАИ, каф 806, Сети ЭВМ 26
Windows Communication Foundation контракты сообщений
Используется для контроля над SOAP сообщениями.
Пример
1.[MessageContract]
2.public class MyRequestMessage
3.{
4.[MessageHeader]
5.public int count;
6.[MessageBodyMember(Order = 0)]
7.public String person;
8.}
9.[ServiceContract]
10.public interface IMyRequestHandler
11.{
12.[OperationContract]
13.bool ProcessRequest(MyRequestMessage msg);
14.}
31. МАИ, каф 806, Сети ЭВМ 31
Windows Communication Foundation пример/клиент
Создаем проект
Создаем ссылку на службу (Add Web-reference). При этом добавляются сборки System.Runtime.Serializationи System.ServiceModel
Пишем код
1.using System;
2.using System.Collections.Generic;
3.using System.Text;
4.using WCFServiceExample;
5.namespace WCFClient
6.{
7.class Program
8.{
9.static void Main(string[] args)
10.{
11.Console.WriteLine("Connecting to server ..");
12.InputObject inp = new InputObject();
13.inp.LastName = "Ivanov";
14.inp.FirstName = "Ivan";
15.MyServiceClient srv = new MyServiceClient();
16.OutputObject otp = srv.doAction(inp);
17.Console.WriteLine(otp.Message);
18.Console.ReadLine();
19.}
20.}
21.}
33. МАИ, каф 806, Сети ЭВМ 33
Windows Communication Foundationbinding
Binding определяет как служба будет взаимодействовать с клиентами. А именно:
Адрес;
Транспортный протокол;
Требования к безопасности;
Формат кодирования;
Требования транзакций;
Определяются на уровне создания хоста сервиса;
34. МАИ, каф 806, Сети ЭВМ 34
Windows Communication Foundation ServiceBehavior
ServiceBehavior определяется на уровне класса, реализующего ServiceContract (наследующего интерфейс). Описывает доп. функциональность, для службы.
Пример
1.[ServiceBehavior]
2.public class MyServiceImpl : IMyService
3.{
4.public OutputObject doAction(InputObject parameter)
5.{return new OutputObject();}
6.}
Значения
TransactionAutoCompleteOnSessionClose –аналог [AutoComplete]
TransactionIsolationLevel –уровень изоляции транзакций
ReleaseServiceInstanceOnTransactionComplete–Позволяет повторное использование экземпляра объекта
AutomaticSessionShutdown–Разрывает сеанс при окончании вызова
InstanceContextMode–Аналог SingleCall/Singleton в Remoting
ConcurrencyMode –Управление множественным доступом к службе из разных клиентов(single/multi)
UseSynchronizationContext–Для внутренних служб WinForms, что бы создавать службу в потоке, в котором она инициируется
IncludeExceptionDetailInDaults–Включать в Exception развернутое описание ошибки
MaxItemsInObjectGraph–ограничение числа передаваемых объектов
AddressFilterMode: Управление фильром сообщений: Any , Exact , and Prefix ..
IgnoreExtensionDataObject: Если установленно в true то расширения не передаются..
35. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundation metadata publishing
ServiceHosthost = new ServiceHost(typeof(MyService));
ServiceMetadataBehaviorserviceMetadata=
host.Description.Behaviors.Find< ServiceMetadataBehavior> ();
if (serviceMetadata== null)
{
serviceMetadata= new ServiceMetadataBehavior();
host.Description.Behaviors.Add(serviceMetadata);
}
serviceMetadata.HttpGetEnabled= true;
BasicHttpBindingbinding = new BasicHttpBinding();
host.AddServiceEndpoint(typeof(IMyService),
Binding,"http://localhost:8080/MyService");
35
36. МАИ, каф 806, Сети ЭВМ 36
Windows Communication Foundation OperationBehavior
Применяется к методам класса, реализующего интерфейс с ServiceContract
Значения
AutoDisposeParameters –если стоит true –то за очистку параметров отвечает сервер, иначе –клиент.
Impersonation–позволяет идентифицировать вызывающего;
ReleaseInstanceMode–определяет режим освобождения экземпляра (на уровне операции);
TransactionScopeRequired–требуется ли транзакция или нет;
TransactionAutoComplete–должна ли транзакция завершаться автоматически или нет;
37. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundation OperationBehavior/пример
using System;
using Wrox.CarRentalService.Contracts;
namespace Wrox.CarRentalService.Implementations.Europe
{
public class CarRentalService: ICarRentalService
{
[OperationBehavior(
AutoDisposeParameters= true,
Impersonation = ImpersonationOption.NotAllowed,
ReleaseInstanceMode= ReleaseInstanceMode.None,
TransactionAutoComplete= true,
TransactionScopeRequired= false)]
double CalculatePrice(DateTimepickupDate, DateTimereturnDate,stringpickupLocation, string vehiclePreference)
{
// method code here
}
}
}
37
38. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundation endpoint behaviour/пример
CarRentalServiceClientclient = new CarRentalServiceClient();
try
{
client.ClientCredentials.ClientCertificate.SetCertificate(
StoreLocation.CurrentUser,
StoreName.My,
X509FindType.FindBySubjectDistinguishedName,
"CN=client_cert");
// other code
client.Close();
}
catch (Exception ex)
{
client.Abort();
throw;
}
ServiceHosthost = new ServiceHost(typeof(CarRentalService));
try
{
BasicHttpBindingbinding = new BasicHttpBinding();
ServiceEndpointserviceEndpoint=
host.AddServiceEndpoint(typeof(ICarRentalService),
binding,
"http://localhost:8080/CarRentalService");
ServiceCredentialscredentials = new ServiceCredentials();
credentials.ServiceCertificate.SetCertificate(
StoreLocation.CurrentUser,
StoreName.My,
X509FindType.FindBySubjectDistinguishedName,
"CN=service_cert");
host.Open();
// other code here ...
host.Close();
38
39. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundationстандартные binding
39
40. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundation клиенты
40
41. МАИ, каф 806, Сети ЭВМ 41
Windows Communication Foundation клиенты
Клиентскому приложению для получения доступа к службе нужен прокси. Его можно создать:
Visual Studio –Add Service Reference
Инструмент svcutil.exe
Класс ChannelFactory<TChannel>
Пример
1.static OutputObject UseChannelFactory(InputObject inp)
2.{
3.WSHttpBinding binding = new WSHttpBinding();
4.EndpointAddress address = new EndpointAddress("http://localhost:8080/MyService");
5.ChannelFactory<IMyService> factory = new ChannelFactory<IMyService>(binding, address);
6.try
7.{
8.IMyService service = factory.CreateChannel();
9.return service.doAction(inp);
10.}
11.finally
12.{
13.factory.Close();
14.}
15.}
42. МАИ, каф 806, Сети ЭВМ 42
Windows Communication Foundation дуплексная коммуникация
При дуплексной коммуникации служба может вызывать клиента;
Канал должен быть дуплексным;
На стороне клиента описывается контракт, который прописывается на сервере в свойстве CallbackContract;
1.[ServiceContract(CallbackContract=typeof(ICalculatorDuplexCallback))]
2.public interface ICalculatorDuplex{
3.[OperationContract(IsOneWay = true)]
4.void AddTo(double n);
5.}
Клиент
1.public interface ICalculatorDuplexCallback{
2.[OperationContract(IsOneWay = true)]
3.void Equals(double result);
4.}
Вызов клиента на сервере
callback =
OperationContext.Current.GetCallbackChannel<ICalculatorDuplexCallback>();
44. МАИ, каф 806, Сети ЭВМ 44
Windows Communication Foundation потоковые данные
Устанавливаем transferMode="Streamed" в Binding (клиента и сервера).
Устанавливаем <httpRuntime maxRequestLength="65536"/> (сервер)
Описываем MessageContract (должен быть тип данных с потоком
[MessageContract] public class FileUploadMessage{ [MessageHeader(MustUnderstand = true)] public DataContracts.DnvsDnvxSession DnvxSession[MessageHeader(MustUnderstand = true)] public DataContracts.EApprovalContext Context[MessageHeader(MustUnderstand = true)] public DataContracts.FileMetaData FileMetaData[MessageBodyMember(Order = 1)] public System.IO.Stream FileByteStream}
Описываем серверный контракт
[OperationContract(Action = "UploadFile", IsOneWay = true)]
void UploadFile(ServiceContracts.FileUploadMessage request);
Реализуем сервер
public void UploadFile(FileUploadMessage request) { Stream sourceStream = request.FileByteStream;
…
45. МАИ, каф 806, Сети ЭВМ
Windows Communication Foundationinstancecontectmode/PerCall
// Per Call
[ServiceBehavior(
InstanceContextMode = InstanceContextMode.PerCall)]
public class CarRentalService: ICarRentalService
{
…
//Singleton
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode. Multiple )]
public class CarRentalService: ICarRentalService
{
…
// Per session
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class CarRentalService: ICarRentalService
{
…
PerCall
При каждом новом вызове сервера создается новый экземпляр объекта на сервере.
Очень удобно для масштабирования.
Накладные расходы на создание объекта.
Singleton
Используется один экземплярвсегда.
Необходимо установить ConcurrencyMode.Multiple
PerSession
Каждый клиент взаимодействует всегда с одним и тем же сервером.
Взаимодействие обрывается по таймауту или по прерывании сессии клиентом (вызов метода Close).
45
46. МАИ, каф 806, Сети ЭВМ
Windows Communication FoundationserviceThrottling Behavior
< serviceBehaviors >
< behavior name="throttlingBehavior" >
< serviceThrottling
maxConcurrentCalls ="5"
maxConcurrentSessions="2"
maxConcurrentInstances="3" / >
< /behavior >
< /serviceBehaviors >
Включение счетчиков производительности
< system.serviceModel >
< diagnostics performanceCounters="All"/ >
< /system.serviceModel >
Позволяет управлять нагрузкой на сервер
Ограничивает максимальное число параллельно выполняемых процессов
Максимальное число параллельно поддерживаемых сессий
Максимальное число одновременно загруженных в память объектов сервера
46
47. МАИ, каф 806, Сети ЭВМ
Windows Communication FoundationConcurrencyMode
Устанавливается ServiceBehavior
По умолчанию, ConcurrencyMode.Single
У одному объекту может обращаться только один поток (клиент)
Нет проблем с разделяемым доступом к ресурсам
ConcurrencyMode.Multiple
Любое количество потоков может обращаться к объекту
Необходимо решать проблемы с разделяемым доступом
Имеет значение если вы разрабатываете многопоточный клиент с методом доступа PerSession или Singleton.
В случае PerCall –на каждый запрос и так создается новый серверный объект.
47
48. МАИ, каф 806, Сети ЭВМ 48
Windows Communication Foundation итого
Комбинирует функциональность Web-Service, .NET Remoting, MSMQ и Enterprise Services;
Включает средства для обеспечения:
Настраиваемый хостинг компонентов и служб;
Декларативное поведение;
Различные коммуникационные каналы (HTTP, TXP, ...);
Инфраструктура безопасности;
Расширяемость (сбоственные каналы, форматировщики и прокси);
Поддержка предшествующих технологий (например можно сделать WCF сервис, взаимодействующий с Web Service)
49. МАИ, каф 806, Сети ЭВМ
RESTSystem.ServiceModel.Web
Используется расширение WebGetи WebInvokeдлOperationContractи webHttpBinding
[ServiceContract()]
publicinterfaceICarRentalService
{
[OperationContract]
[WebGet(UriTemplate= "/CarPool")]
CarPoolGetAllCars();
[OperationContract]
[WebGet(UriTemplate= "/CarPool/{carName}?format=xml",ResponseFormat= WebMessageFormat.Xml)]
Car GetCarXML(string carName);
[OperationContract]
[WebGet(UriTemplate= "/CarPool/{carName}?format=json",ResponseFormat= WebMessageFormat.Json)]
Car GetCarJSON(string carName);
[OperationContract]
[WebInvoke(UriTemplate= "CarPool/{carName}", Method = "PUT")]
Car AddCar(string carName, Car car);
[OperationContract]
[WebInvoke(UriTemplate= "/CarPool/{carName}", Method = "DELETE")]
void DeleteCar(string carName);
}
49
50. МАИ, каф 806, Сети ЭВМ
Что почитать?
PROFESSIONAL
WCF 4
WINDOWS COMMUNICATION FOUNDATION WITH .NET 4
Pablo Cibraro Kurt Claeys Fabio Cozzolino Johann Grabner
50
52. МАИ, каф 806, Сети ЭВМ
AXIS2
Класс ServiceClient –простой прием и отправка XML сообщений
ServiceClientимеет следующий набор API
sendRobust –просто отправка XML без ожидания ответа, но с получением Exception в случае ошибуи.
FireAndForget–просто отправка XML без ожидания ответа или исключения
SendRecieve–отправка запроса и получение ответа
SendReceiveNonBlocking–То же что и SendReceive но с получением ответа через CallBack объект.
Трансортный уровень
HTTP/HTTPS
TCP (только совместно с WS-Addressing)
SMTP (требует e-mail аккаунт)
JMS (будет рассматриватся в лекции про очереди сообщений)
XMPP (jabber сервера http://xmpp.org/)
Кодогенерация –для упрощения вызова удаленных сервисов и публикации своих.
52
53. МАИ, каф 806, Сети ЭВМ 53
Web.Service. Java. AXIS
Используется библиотека Apache Axis2
Доступна для скачивания http://ws.apache.org/axis/
Включает в себя
Сервер, для запуска Веб-сервисов
Сервер, для встраивания в Tomcat
Поддержка WSDL
Средства генерации Java-классов по WSDL
Для написания сервера необходимо:
Написания Java-класса «сервера»
Запуска сервера либо в составе J2EE сервера, либо Online
Для запуска Online необходимо воспользоваться классомorg.apache.axis2.engine.AxisServer
Сервис будет доступен по адресу http://localhost:6060/axis/services/ИмяКласса
Где ИмяКласса –имя вашего класса, который вы опубликовали в виде сервиса.
54. МАИ, каф 806, Сети ЭВМ 54
Web.Service. Java. AXIS. Сервер
1.publicclassMyService {
2.// всеpublic методы станут доступны как методы веб-сервиса (очень удобно)
3.publicint[] doHelloWorld(int[]src)
4.{
5.int[] result = newint[src.length];
6.for(inti=0;i<src.length;i++) result[i]=src[src.length-i-1];
7.returnresult;
8.}
9.// вообще говоря, исключения надо обрабатывать корректно
10.publicstaticvoidmain(String[] args) throwsException
11.{
12.// запускаем сервис
13.neworg.apache.axis2.engine.AxisServer().deployService(
14.MyService.class.getName());
15.}
16.}
55. МАИ, каф 806, Сети ЭВМ
AXIS2 Client
Клиент делается ещё проще:просто запускаем кодогенерациюпо URI wsdlили wsdl-файлу.
java -classpathaxis2-codegen-1.6.1.jar;axis2-kernel-1.6.1.jar;wsdl4j-1.6.2.jar;commons-logging- 1.1.1.jar;neethi-3.0.1.jar;axiom-api-1.2.12.jar;axiom-dom-1.2.12.jar;axiom-impl- 1.2.12.jar;XmlSchema-1.4.7.jar;axis2-adb-codegen-1.6.1.jar;axis2-adb-1.6.1.jar org.apache.axis2.wsdl.WSDL2Java -urihttp://localhost:6060/axis2/services/MyServer?wsdl
Получается набор файлов:
MyServiceStub.java–заглушка сервиса
MyServiceStubExceptionException0.java–исключение, генерируемоесервисом
MyServiceStubCallbackHandler.java–callback объект для неблокируемых вызовов
55