Computação Orientada aos Serviços WCF Semestre de Inverno 11/12 (Parte 1)
WCF O Windows Communication Foundation (WCF) é uma application programming interface (API) na.net Framework para construir aplicações orientadas aos serviços. O WCF é desenhado para utilizar os princípios da arquitectura orientada aos serviços e para suportar computação distribuída Os serviços são loosely coupled. Têm tipicamente uma inteface passível de ser descrita em WSDL. 2
Características do WCF Interoperabilidade e Standards Suporta os protocolos WS-* Modelo de programação unificado Unifica modelos anteriores como o.net Remoting, ASMX Web services, COM+ Modelo de programação Declarativo Imperativo Baseado em configurações 3
WCF endpoints Endereço (onde) Binding (como) Contrato (o que) 4
Endereço Combinação de transporte, nome do servidor, porta e caminho O transporte é determinado pelo binding Exemplos: http://localhost:8001 net.tcp://localhost:8002/myservice net.pipe://localhost/mypipe net.msmq://localhost/private/myservice net.msmq://localhost/myservice 5
Bindings Transporte HTTP TCP MSMQ Formatos de mensagem e codificação Plain text Binário Os canais usados para transporte one-way request-reply duplex Segurança na comunicação Sem segurança Segurança ao nível do transporte Segurança ao nível da mensagem Invocações autenticadas e autorizadas 6
Classes de Binding BasicHttpBinding WSHttpBinding WSDualHttpBinding WSFederationHttpBinding NetNamedPipeBinding NetPeerTcpBinding NetTcpBinding MsmqIntegrationBinding NetMsmqBinding... 7
Contratos Contratos de serviço Definem operações, comunicações e comportamentos Contratos de Dados Definem entidades de dados e tipos de parâmetros Contratos de Falha Definem tipos de erros Contratos de Mensagem Definem formatos de mensagem 8
Contratos de Serviços [ServiceContract] define um conjunto de operações [OperationContract] define uma operação/método [ServiceContract] public interface IBookMarkService{ [OperationContract] BookMarks GetBookMarks(); [OperationContract] BookMark GetBookMark(string id);... } Definidos no namespace System.ServiceModel. 9
Propriedades Propriedades do ServiceContract: CallBackContract Name Namespace SessionMode ConfigurationMode Propriedades do OperationContract: Action AsyncPattern IsInitiating IsOneWay IsTerminating Name ReplyAction 10
Contratos de Dados [DataContract] especifica um tipo como um contrato de dados [DataMember] membros que fazem parte do contrato [CollectionDataContract] especifica uma colecção de elementos como um contrato de dados [DataContract] public class CustomType { [DataMember] public bool MyFlag { get; set; } [DataMember] public string MyString { get; set; } Definidos no namespace System.Runtime.Serialization. 11
Metadata Exchange Serviços podem também expor endpoints para Metadata Exchange (MEX) Fornece um mecanismo para os clientes saberem: O endereço de outros endpoints Os bindings que são utilizados Contratos utilizados Serviço, Operações, Dados, etc. 12
Hosting IIS HTTP WAS (Windows Activation Service) Pode utilizar qualquer transporte Vista e Windows Server 2008 Self hosting Pode utilizar qualquer transporte Pode ser hosted com aplicações Console, WinForms, etc 13
Passagem de dados Para os dados poderem ser acedidos pelas várias aplicações cliente, é necessário serem serializados A Framework.NET já contém um atributo para serialização [Serializable] public class Person { public string LastName; public string FirstName; } No entanto, o atributo de serialização tem algumas limitações Inclui alguma informação de tipos nos dados serializados não é adequado para SOA Não suporta aliases Não suporta versioning 14
Alternativa - DataContract DataContract: criado especificamente para WCF para serializar tipos. O atributo contem as propriedades: Name, Namespace DataMember: é necessário para especificar que propriedades/ campos fazem parte do contrato. Contém as propriedades: EmitDefaultValue, IsRequired, Name, Order [DataContract(Name="Contact")] public class Person { [DataMember(IsRequired=true, Name="SurName")] public string LastName; 15 } public string FirstName; //Não está incluído no contrato
Versioning de contratos de dados Três cenários diferentes: Novos campos foram adicionados Campos antigos foram eliminados Campos foram renomeados [DataContract] public class MyDataContract : IExtensibleDataObject { public ExtensionDataObject ExtensionData { get; set; } } 16
Exemplos //... [DataContract( Name = "Person", Namespace ="http://www.cohowinery.com/employees")] class Person : IExtensibleDataObject { private ExtensionDataObject extensiondataobject_value; public ExtensionDataObject ExtensionData { get { return extensiondataobject_value; } set { extensiondataobject_value = value; } } [DataMember] public string Name; } //O novo campo fica armazenado no campo ExtensionDataObject da primeira versão [DataContract(Name = "Person", Namespace = "http://www.cohowinery.com/employees")] class PersonVersion2 : IExtensibleDataObject{ [DataMember(Order=2)] public int ID; [DataMember] public string Name; private ExtensionDataObject extensiondataobject_value; public ExtensionDataObject ExtensionData { get { return extensiondataobject_value; } set { extensiondataobject_value = value; } } } 17
Herança com os contratos de dados [DataContract] public class Employee {... } [DataContract] public class Manager : Employee {... } [ServiceContract] public interface IEmployeeService { [OperationContract] public void AddEmployee(Employee e); } E na desserialização, o que acontece? 18
Herança com os contratos de dados [DataContract] [KnownType(typeof(Manager))] public class Employee {... } [DataContract] public class Manager : Employee {... } [ServiceContract] public interface IEmployeeService { [OperationContract] public void AddEmployee(Employee e); } 19
Manipular Excepções Podem ocorrer 3 tipos principais de excepções: Erros de comunicação Erros inesperados no serviço Erros lançados pelo serviço por uma determinada causa As excepções.net são específicas da tecnologia 20
Falhas Em WCF, falhas SOAP são passadas como objectos do tipo FaultException Em vez de lançar excepções, os serviços devem lançar FaultExceptions ( i.e., FaultException<T>) Lançar excepções do tipo FaultException não irá provocar falhar nem no proxy nem no canal [FaultContract]: especifica que tipo de excepção pode ser lançado por uma operação [ServiceContract] public interface IEmployeeService { [OperationContract] [FaultContract(typeof(ValidationException))] public void AddEmployee(Employee e); } 21
Server side As excepções são lançadas como Fault Exceptions public class EmployeeService { public void AddEmployee(Employee e) {... throw new FaultException<ValidationException> (new ValidationException(errorMsg)); } } 22
Client side EmployeeServiceProxy proxy = new EmployeeServiceProxy(); try {... proxy.addemployee(emp); } catch(faultexception<validationexception> e) { //Do stuff with exception here } catch(faultexception e) { //Will catch all other types of Fault exceptions... } 23
Atributo ServiceBehavior Não faz parte do contrato, é específico das implementações Permite controlar elementos de comportamento, tais como: Concorrência Instância PerCall, PerSession, Shareable Transacções Gestão de sessões Comportamento de Threads Throttling 24
Atributo OperationBehavior Os aspectos operacionais que podem ser controlados por este atributo são: Transaccional Identidade de quem invoca a operação Reciclagem do objecto 25
Principais assemblies WCF Assembly Objectivo System.Runtime.Serialization.dll Define namespaces e tipos que podem ser utilizados para serializar e desserializar objectos na framework WCF System.ServiceModel.dll Contém os tipos utilizados para construir qualquer tipo de aplicação WCF 26
Alguns Namespaces WCF Namespace System.Runtime.Serialization System.ServiceModel System.ServiceModel.Configuration System.ServiceModel.Description Objectivo Define tipos para controlar como os dados são serializados e desserializados Define tipos de binding e hosting, assim como tipos básicos de segurança e associados a transacções Define tipos que dão acesso programático a ficheiros de configuração WCF Define tipos que fornecem um modelo de objectos para os endereços, bindings e contratos definidos nos ficheiros de configuração no contexto do WCF System.ServiceModel.MsmqIntegration Contém tipos para fornecer integração com o serviço MSMQ 27
A composição básica de uma aplicação WCF O assembly do serviço WCF: este dll contém as classes e interfaces que representam a funcionalidade que se pretende expor O host do serviço WCF: este módulo de software é a entidade que faz hosting do assembly do serviço WCF O cliente WCF: este é a aplicação que acede à funcionalidade do serviço, através do proxy interveniente 28