113
1 Välkommen till Sommarkollo 2006 Windows Communication Foudnation 2006

Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Embed Size (px)

DESCRIPTION

2006. Välkommen till Sommarkollo 2006 Windows Communication Foudnation. Windows Communication Foundation. Johan Lindfors. Agenda. Vad är WCF Programmera WCF Kontrakt ”Hostning” och uppträdanden Bindningar och metadata Andra koncept Migrering eller integration Monitorering Säkerhet - PowerPoint PPT Presentation

Citation preview

Page 1: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

1

Välkommen till Sommarkollo

2006Windows Communication

Foudnation

2006

Page 2: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Windows Communication FoundationJohan Lindfors

Page 3: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Agenda Vad är WCF Programmera WCF

Kontrakt ”Hostning” och uppträdanden Bindningar och metadata

Andra koncept Migrering eller integration Monitorering Säkerhet Transaktioner Köhantering

Page 4: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Hur ser det ut idag?

Remoting

ASMX / WSE

DCOM

System.Messaging

Enterprise Services

Microsoft

Sockets

RMI

JAX-RPC

CORBA

JMS

EJB

J2EE

Sockets

Page 5: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

WCF byggstenar Förenar teknikerna för distribuerad

kommunikation ”On-machine”, ”Cross-machine”,

”Cross-Internet”

Brett stöd för WS-* specifikationerna Kompatibelt med existerande

tekniker från Microsoft

Förenklar utvecklingen av löst kopplade tjänster

Konfigurationsbaserad kommunikation

Enhetlig

Interoperabilitet

Tjänsteorienterat

Page 6: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

En samlingsklass för olika typer

Lagra instanser i strukturen

Hämta instanser

public class Stack{ object[] items; public void Push(object item){…} public object Pop(){…}}

Lite om generiska klasser

Stack stack = new Stack();int i;string s = null;stack.Push(i);stack.Push(s); // Inkonsekvens i typer!

string s = (string)stack.Pop(); //Paying for cast

Page 7: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Hur kul är det här egentligen?public class IntegerStack{ int[] items; public void Push(int item){…} public int Pop(){…}}

Utan generiska klasser

public class StringStack{ string[] items; public void Push(string item){…} public string Pop(){…}}

Page 8: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Mallen

Användningen

public class Stack<T> //T är generisk typparameter{ T[] items; public void Push(T item){…} public T Pop(){…}}

Med generiska klasser

Stack<int> integerStack = new Stack<int>(); integerStack.Push(1);

Stack<string> stringStack = new Stack<string>();stringStack.Push(“Hello, World!”);

Page 9: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Flera typer vid definition

Använda aliaser

Begränsningar

public class Point<X,Y>{…}

Point<int,int> point = null;

Detaljer…

using IntegerPoint = Point<int,int>;IntegerPoint point = null;

public class Stack<T> where T: IComparable

public class Node<T> where T: new() { private T item = new T();}

Page 10: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Kan bara konvertera typparametrar till ”interface”

Ärva från en generisk klass

class MyClass<T>{ void SomeMethod(T t) { ISomeInterface something = (ISomeInterface)t; SomeClass somethingElse = (SomeClass)t; //Error! }}

Mer detaljer…

public BaseClass<T>{…}

public ChildClass: BaseClass<string> {…}

Page 11: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Generiska metoderpublic class MyClass{ public void MyMethod<T>(T t) { … }}

MyClass instance = new MyClass();instance.MyMethod(3);instance.MyMethod(“Hello, World”);

Mer detaljer…

Page 12: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Klient Tjänst

Klienter och tjänster

Page 13: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Klient Tjänst

“Endpoints”

EndpointEndpoint

Endpoint

Endpoint

Endpoints exponerar funktionalitet

Page 14: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Klient Tjänst

Adress, Bindning, Kontrakt

ABC

CBA

CBA

CBA

Endpoints exponerar funktionalitet Adress beskriver VART! Bindning beskriver HUR! Kontrakt beskriver VAD!

Page 15: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

WSDLKlient Tjänst

Metadata

ABC

CBA

CBA

CBA

Endpoints exponerar funktionalitet Adress beskriver VART! Bindning beskriver HUR! Kontrakt beskriver VAD!

WSDL beskriver ”endpoints”

Page 16: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

WSDLKlient Tjänst

Uppträdanden

Uppträdanden beskriver exempelvis Instansiering och aktivering Sessionshantering Transaktioner

ABC

CBA

CBA

CBAU UU

Page 17: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

[ServiceContract]public interface IHello{ [OperationContract] string Hello(string name);}

Definition av kontrakt och tjänst

public class HelloService : IHello{ public string Hello(string name) { return "Hello, " + name; }}

Kontrakt

Implementation

Page 18: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

I en egen applikation

IIS/WAS (http://localhost/HelloService/HelloService.svc)

class HelloHost{ static void Main(string[] args) { ServiceHost host = new ServiceHost(typeof(HelloService)); host.Open(); // Wait until done accepting connections Console.ReadLine(); host.Close(); }}

Hostning av tjänsten

<%@ ServiceHost Language=“C#” Service=“HelloService” %>

Page 19: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Konfiguration<?xml version="1.0" encoding="utf-8" ?><configuration> <system.serviceModel> <services> <service name="HelloService"> <endpoint address="http://localhost/HelloService" binding="basicHttpBinding" contract="IHello" /> </service> </services> </system.serviceModel></configuration>

Page 20: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Kod

Konfiguration

static void Main() { IHello proxy = new ChannelFactory<IHello> ("HelloEndpoint").CreateChannel(); string r = proxy.Hello("Beat"); Console.WriteLine(r);}

Implementera klienten

<system.serviceModel> <client> <endpoint name="HelloEndpoint" address="http://localhost/HelloService" binding="basicHttpBinding" contract="IHello" /> </client></system.serviceModel>

Page 21: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Arkitektur för dagen

Store

ASP.NETWebApplication

StoreService

AdminService

AdminClient

WindowsApplication

AdminServiceCallback

StoreClient

WindowsApplication

Shipments

WindowsApplication

ShipmentService

Customers

ASP.NETWebApplicationCustomerService

Orders

ASP.NETWebApplication OrderService

Inventory

ASP.NETWebApplication

InventoryServiceWS

Page 22: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Agenda Vad är WCF Programmera WCF

Kontrakt ”Hostning” och uppträdanden Bindningar och metadata

Andra koncept Migrering eller integration Monitorering Säkerhet Transaktioner Köhantering

Page 23: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Kontrakt Strukturella – ”Structural”

[DataContract] [MessageContract]

Agerande – ”Behavioral” [ServiceContract] [OperationContract] [FaultContract]

Page 24: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Oberoende av OO-åtkomstnivåer

[DataContract]

using System.Runtime.Serialization;

[DataContract(Name="PersonType")]public class Person {

[DataMember]public string name;

[DataMember(Name="AgeProperty")]private int age;

[DataMember]float salary;

int positionCode;}

Page 25: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Hantering av samlingar

[DataContract]

[DataContract]public class LibraryCatalog{ [DataMember] System.Collections.Hashtable catalog;}

Page 26: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Använda [KnownType]-attributet

[DataContract]

[DataContract][KnownType(typeof(Book))][KnownType(typeof(Magazine))]public class LibraryCatalog{

[DataMember]System.Collections.Hashtable catalog;

}

[DataContract]public class Book{…}[DataContract]public class Magazine{…}

Page 27: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Vid osäkerhet av datatyper

[DataContract]

[DataContract][KnownType(typeof(Book))][KnownType(typeof(Magazine))]public class PublishedItem{

[DataMember]object catalog;[DataMember]DateTime publicationDate;

}

[DataContract]public class Book{…}[DataContract]public class Magazine{…}

Page 28: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Versionshantering

[DataContract]

[DataContract]public class Car{ [DataMember(IsRequired = true)] public string Model; [DataMember(IsRequired = false)] //default public int HorsePower;}

Page 29: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

För skräddarsydda ”SOAP-headers” Vilket inte rekommenderas

[MessageContract]

[DataContract]public class PurchaseOrder {...}

[MessageContract]public class PurchaseOrderMessage{ [MessageHeader] public int Number; [MessageBody(Order = 1)] public PurchaseOrder Order;}

Page 30: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Kontrollerar hur strukturella kontrakt serialiseras

[ServiceContract]

[ServiceContract][DataContractFormat( Style=OperationFormatStyle.Document)] //Or Rpcpublic interface IOrderEntry {...}

[ServiceContract][XmlSerializerFormat( Style=OperationFormatStyle.Document, Use=OperationFormatUse.Literal)] //Or Encodedpublic interface IOrderEntry {...}

Page 31: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Duplex

[ServiceContract]

[ServiceContract(Session = true, CallbackContract = typeof(IOrderEntryCallback))]public interface IOrderEntry{ [OperationContract(IsOneWay = true)] void PlaceOrder(PurchaseOrder order);}

[ServiceContract]public interface IOrderEntryCallback{ [OperationContract(IsOneWay = true)] void PlaceOrderCompleted( PurchaseOrderStatus orderStatus);}

Page 32: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Implementation En implementation av ett interface Klassen kallas då ”Service Type”

[ServiceContract]

[ServiceContract]public interface IOrderEntry { [OperationContract(IsOneWay = true)] void PlaceOrder(PurchaseOrder order);}

internal class OrderEntryService : IOrderEntry{ void IOrderEntry.PlaceOrder(PurchaseOrder order) { //Your code goes here }}

Page 33: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Exponera metoder

Egenskapen ”Action”

[ServiceContract]public interface IOrderEntry{ [OperationContract(IsOneWay = true)] void PlaceOrder(PurchaseOrder order);}

[OperationContract]

[ServiceContract]public interface IOrderEntry{[OperationContract( Action="http://contoso.com/GetOrder", ReplyAction="http://contoso.com/GetOrderReply")] PurchaseOrder GetOrder(String orderIdentifier);}

Page 34: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Rekommendation Använd Action=”*” som en generell

funktion

[OperationContract]

[ServiceContract]public interface MyContract { [OperationContract(IsOneWay = true, Action="urn:crud:insert")] void ProcessInsertMessage(Message message); [OperationContract(IsOneWay = true, Action="urn:crud:update")] void ProcessUpdateMessage(Message message); [OperationContract(IsOneWay = true, Action="urn:crud:delete")] void ProcessDeleteMessage(Message message); [OperationContract(IsOneWay = true, Action="*")] void ProcessUnrecognizedMessage(Message message); }

Page 35: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Synkront

Asynkront

[ServiceContract]public interface IMath{ [OperationContract] int Add(int I, int j);}

[OperationContract]

[ServiceContract]public interface IMath{ [OperationContract(AsyncPattern = true)] IAsyncResult BeginAdd( int i, int j, AsyncCallback cb, object o); int EndAdd(IAsyncResult result);}

Page 36: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

[FaultContract][DataContract]class MyFault { [DataMember] public string Reason = null;}[ServiceContract]public interface IOrderEntry { [OperationContract] [FaultContract(typeof(MyFault))] PurchaseOrder GetOrder(String orderId); }public class OrderEntry: IOrderEntry { public PurchaseOrder GetOrder(string orderId) { try{…}

catch(Exception exception) { MyFault theFault = new MyFault(); theFault.Reason = “Some Reason”; throw new FaultException<MyFault>(theFault); }

}}

Page 37: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

På klienten[DataContract(Name="MyFault")]public class ClientFault{

[DataMember]string Reason = null;

}

...

try { PurchaseOrder order = Service.GetOrder(orderId);}catch (FaultException<ClientFault> clientFault) { Console.WriteLine(clientFault.Detail.Reason);}

[FaultContract]

Page 38: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Kod först

Kontrakt först

[ServiceContract]public class OrderEntry { [OperationContract(IsOneWay = true)] public void PlaceOrder(PurchaseOrder order) { return; }}

Programmera kontrakt

[ServiceContract]public interface IOrderEntry { [OperationContract(IsOneWay = true)] void PlaceOrder(PurchaseOrder order);}public class OrderEntry : IOrderEntry { public void PlaceOrder(PurchaseOrder order) { return; }}

Page 39: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

WCF och WSDL WSDL kontrakt genereras i flera filer

Använder <wsdl:import.../> Scheman separeras alltid från tjänsten

<wsdl:definitions> <wsdl:portType.../>

<wsdl:binding.../>

<wsdl:service.../><endpoint name="MyServiceEndpoint"      bindingNamespace="http://myservice.com/binding"

[ServiceContract(Namespace="urn:gadgets-org")]public interface MyServiceContract {}

[ServiceBehavior(Namespace="urn:my-unique-namespace2")]public class MyService : IMyService

Page 40: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Agenda Vad är WCF Programmera WCF

Kontrakt ”Hostning” och uppträdanden Bindningar och metadata

Andra koncept Migrering eller integration Monitorering Säkerhet Transaktioner Köhantering

Page 41: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

I egna applikationer

Hosting - Implementation

[ServiceContract]public interface ILenderService {...}internal class LenderService: ILenderService {...}

public class Program { static void Main(string[] args) { using (ServiceHost host = ServiceHost( typeof(LenderService))) { host.Open(); Console.WriteLine(”Host is active."); Console.ReadLine(); host.Close(); } }}

Page 42: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

I hanterad ”Windows Service” Processens livslängd kontrolleras av

OS Inbyggd “Service Control Manager”

Hosting - Implementation

public partial class MyNTService : ServiceBase { private ServiceHost host = null; public MyNTService() { InitializeComponent(); }

protected override void OnStart(string[] args) { this.host = new ServiceHost( typeof(LenderService)); host.Open(); }

protected override void OnStop() { host.Close(); }}

Page 43: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

IIS 5.1 och 6 Bara över HTTP

Med WAS HTTP, TCP, NamedPipes

using System.ServiceModel;

namespace MyNamespace{

[ServiceContract]public interface ILender {…}

internal class LenderService: ILender {…}}

Hosting - Implementation

<%@ ServiceHost Language=“C#” Service=“MyNamespace.LenderService” %>

Page 44: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Uppträdanden Vid utveckling

Instansiering ”Concurrency” ”Throttling” ”Transactions”

Vid driftsättning

Page 45: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

.PerCall En instans per anrop

.PerSession, .Shareable En instans per session

.Single En instans per tjänst

Instansiering

[ServiceContract] public interface IEcho{ … }

[ServiceBehavior(InstanceContextMode= InstanceContextMode.Single)]internal class MyService: IEcho { …}

Page 46: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

.Single Med ytterligare konstruktorer

Instansiering

[ServiceContract]public interface IEcho{ ... }

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]internal class MyService: IEcho { private string myData = null;

private MyService(){} internal MyService(string startUpData){ this.myData=startUpData; } ...}

public class MyHost { MyService service = new MyService(“The initial data”); using(ServiceHost host = new ServiceHost(service)) { ... }}

Page 47: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

.PerSession

Instansiering

[ServiceContract][ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]public class Math{ private long sum = 0;

[OperationContract] public int Add(int i, int j) { this.sum = this.sum + i + j; return i + j; } [OperationContract] public long GetTotal() { return this.sum; } [OperationContract] [OperationBehavior(ReleaseInstanceMode = ReleaseInstanceMode.AfterCall)] public void Clear() { this.sum = 0; }}

Page 48: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Kontrollerar trådsäkerhet för ”Service Type” med tre lägen Single (som är grundinställning) Multiple Reentrant

Inte relevant för instansering per anrop

“Concurrency”

[ServiceContract]public interface IEchoContract { ... }

[ServiceBehavior(ConcurrencyMode= ConcurrencyMode.Multiple)]public class EchoService: IEchoContract { ... }

Page 49: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Kan användas för att begränsa last Samtidiga anrop, instanser,

kopplingar

“Throttling”

<behaviors> <behavior> <throttling maxConcurrentCalls="2" maxConnections="10" maxInstances="10"/> </behavior></behaviors>

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]public class MyService { ... }

Page 50: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Agenda Vad är WCF Programmera WCF

Kontrakt ”Hostning” och uppträdanden Bindningar och metadata

Andra koncept Migrering eller integration Monitorering Säkerhet Transaktioner Köhantering

Page 51: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Bindningar En bindning består av

Transport + ”Encoding” + Protokoll

Tre sätt att konfigurera Använd en standard Anpassa en standard Skapa en skräddarsydd

Page 52: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Bindningar En bindning består av

Transport + ”Encoding” + Protokoll

Transport HTTP TCP NamedPipe MSMQ

Page 53: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

”Encoding” Text

För bästa interoperabilitet Binary

För bästa prestanda WCF till WCF MTOM

Message Transmission Optimization Protocol

För att bifoga binära tillägg Använder XOP

Page 54: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

MTOM ”Encoding” Implementation i WCF

Välj helt enkelt MTOM som ”encoding”

Alla byte[] och strömmar kommer att MTOM’as

<bindings> <wsHttpBinding> <binding name="MTOMBinding" messageEncoding="Mtom"/> </wsHttpBinding></bindings>

Page 55: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Protokoll Kan innehålla

WS-Security WS-ReliableMessaging WS-Coordination och Transaction

Page 56: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Bindningar

Interoperabiliet Säkerhet

SessionTransaktionerDuplex

BasicHttpBinding BP 1.1 T | SWsHttpBinding WS T | S X XWsDualHttpBinding WS S X X XNetTcpBinding .NET T | S X X XNetNamedPipeBinding

.NET T X X X

NetMsmqBinding .NET T | S XCustomBinding * * * * *T = SSL/TLS | S = WS-Security | O = “One-Way Only”

Page 57: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Att välja bindning

BasicHttpBinding

WsHttpBinding

Interop?

Nivå?

Duplex?

WSDualHttpBinding

NetNamedPipeBinding

NetMsmqBinding

NetPeerTcpBinding

NetTcpBinding

Nej

Basic

Nej

Ja

Lokalt?

Köhantering?

P2P?

Nej

Nej

Nej

Ja

Ja

Ja

WS

Ja

Page 58: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Bindningar: Standard<?xml version="1.0" encoding="utf-8" ?><configuration> <system.serviceModel> <services> <service name="MathService"> <endpoint address="http://localhost/MathEndpoint" binding="wsHttpBinding" contract="IMathService" /> </service> </services> </system.serviceModel></configuration>

OBS: Liten bokstav på bindning i konfiguration

Page 59: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Bindningar: Anpassa<configuration> <system.serviceModel> <services> <service name="MathService"> <endpoint address=”http://localhost/MathEndpoint" binding="wsHttpBinding" bindingConfiguration="MTOMOption" contract="IMath"/> </service> </services> <bindings> <wsHttpBinding> <binding name="MTOMOption" messageEncoding="Mtom"/> </wsHttpBinding> </bindings> </system.serviceModel></configuration>

Page 60: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Definera i kod

Bindningar: Skapa egna

public static void Main(string[] args){ ServiceHost host = new ServiceHost(typeof(MathService), "net.tcp://localhost/8080/MathService/");

ReliableSessionBindingElement r = new ReliableSessionBindingElement(); r.AdvancedFlowControl = true;

SecurityBindingElement s = AsymmetricSecurityBindingElement.CreateKerberosBinding();

TcpTransportBindingElement t = new TcpTransportBindingElement(); t.MaxMessageSize = long.MaxValue;

BinaryMessageEncodingBindingElement e = new BinaryMessageEncodingBindingElement();

CustomBinding binding = new CustomBinding(new BindingElement[]{r,s,t,e});

EndpointAddress address = "net.tcp://localhost/8080/Math/"; host.AddEndpoint(typeof(IMath), binding, address);

host.Open();}

Page 61: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Definera i konfiguration

Bindningar: Skapa egna

<?xml version=“1.0” encoding=“UTF-8” ?><configuration> <system.serviceModel> <bindings> <customBinding> <binding name="MyCustomBinding"> <reliableSession enableFlowControl="true"/> <security authenticationMode="Kerberos"/> <binaryMessageEncoding /> <tcpTransport maxReceivedMessageSize=”..." /> </binding> </customBinding> </bindings> </system.serviceModel></configuration>

Page 62: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Adresser Adresser exponerar transportsätt

http://x.se:80/Service/MyEndPoint net.tcp://x.se:8080/Service/

MyEndPoint net.pipe://x.se/Service/MyEndPoint net.msmq://x.se/MyQueue

Page 63: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Per tjänst En basadress per transportsätt

Per “Endpoint” Adressen är relativ till basadressen

class Program { static void Main(string[] args) { using (ServiceHost host = new ServiceHost( typeof(EchoService), new Uri("http://localhost:8000/EchoService"))) { host.Open(); Console.ReadLine(); host.Close();} } }

Adresser

<service name=”EchoService"> <endpoint address="Echo" binding="basicHttpBinding" contract="IEcho"/></service>

Page 64: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Hostning i IIS eller WAS Adressen är URL för .SVC fil Ex:

http://localhost/MyService/Service.svc

Adresser

<configuration> <system.serviceModel> <services> <service name="Program"> <endpoint address="" binding="basicHttpBinding" contract="IEcho"/> </service> </services> </system.serviceModel></configuration>

Page 65: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Med kod, metod 1 One-off “In-line Proxy”

Klienter

using System.ServiceModel;namespace MyNamespace { public interface IEcho { string Echo(string input); }

public class Program { public static void Main(string[] arguments) { IEcho proxy = new ChannelFactory<IEcho> ("EchoService").CreateChannel(); Console.WriteLine(proxy.Echo(”Ping")); ((IChannel)proxy).Close(); } }}

Page 66: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Med kod, metod 2 Återanvändbar “klass-proxy”

Klienter

using System.ServiceModel;[ServiceContract]public interface IEchoService { [OperationContract] string Echo(string input);}

internal class EchoServiceClient: ClientBase<IEchoService>, IEchoService { public EchoServiceClient(string configurationName) :base(configurationName) { } string IEchoService.Echo(string input) { return this.InnerProxy.Echo(input); }}

public class Program { public static void Main(string[] arguments) { EchoServiceClient client = new EchoServiceClient("EchoService"); ((IEchoServiceClient)client).Echo("Hello, World!"); client.Close(); }}

Page 67: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Konfigurationen

Klienter

<system.serviceModel> <client> <endpoint name="EchoService" address=”http://localhost:8000/EchoService/Echo" binding="basicHttpBinding" contract="MyNamespace.IEcho"/> </client></system.serviceModel>

Page 68: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Agenda Vad är WCF Programmera WCF

Kontrakt ”Hostning” och uppträdanden Bindningar och metadata

Andra koncept Migrering eller integration Monitorering Säkerhet Transaktioner Köhantering

Page 69: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Migrering eller samexistens

Sida-vid-sida Uppgradering

Interoperabilitet

Page 70: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

using System.Web.Services;     public class AccountingOperation{    public string AccountName;    public long Amount;        }

 public class Accounting {

    [WebMethod(TransactionOption=TransactionOption.RequiresNew)]    public int AddEntry(AccountingOperation debit,                        AccountingOperation credit)    {        // Add entry to internal accounting book        // return id.    }}

using System.ServiceModel;

[ServiceContract(FormatMode=ContractFormatMode.XmlSerializer)]

[OperationContract][OperationBehavior(AutoEnlistTransaction=true)]

//

//

ASMX till WCF

Page 71: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

public class Accounting : ServicedComponent{           

public void AddCreditEntry(string creditAccount, int creditAmount)   {          }}

using System.EnterpriseServices;

[ComponentAccessControl][SecureMethod][Transaction(TransactionOption.Required)]

[SecurityRole("Manager")]

using System.ServiceModel;

[ServiceContract]

[OperationContract][OperationBehavior(AutoEnlistTransaction=true)][PrincipalPermission(SecurityAction.Demand, Role="Managers")]

//

//////

//

COM+ till WCF

Page 72: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

using Microsoft.Web.Services3;

[WebService]class HelloWorld {   

[WebMethod]    public string Hello (string text) {

MessageSignature signature = (MessageSignature)RequestSoapContext.Current.Security.Elements[0];if (!signature.SigningToken.Principal.IsInRole ("BUILTIN\Administrators"))

            throw new AuthorizationException("Access denied");         return String.Format("Hello, {0}", text);    }}

// Konfigurationsförändringar krävs också

[OperationContract][PrincipalPermission(SecurityAction.Demand, null, "BUILTIN\Administrators")]

using System.ServiceModel;

[ServiceContract]

//

//

//

//////////

WSE till WCF

Page 73: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

class MyQService { public void ReceiveOrders() { MessageQueue Queue = new MessageQueue(@".\private$\Books"); XmlMessageFormatter formatter = new XmlMessageFormatter( new Type[] { typeof(System.Data.DataSet)}); Queue.Formatter = formatter; System.Messaging.Message msg = null; while((msg= Queue.Receive()) != null) {

DataSet booklist = (DataSet) msg.Body; ProcessOrders(booklist);

} }

Public void ProcessOrder(DataSet BookList) { ... }

}

using System.Messaging;using System.ServiceModel;

[ServiceContract]

[OperationContract(IsOneWay = true)]

//

//

//

//////////////

////

//

MSMQ till WCF

Page 74: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

using System.Runtime.Remoting;     [Serializable]public class AccountingOperation{    public string AccountName;    public long Amount;        } public class Accounting {    public int AddEntry(AccountingOperation debit,                        AccountingOperation credit)    {        // Add entry to internal accounting book        // return id.    }}

using System.ServiceModel;

[ServiceContract]

[OperationContract]

: MarshalByRefObject

//

//

.NET Remoting till WCF

Page 75: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Agenda Vad är WCF Programmera WCF

Kontrakt ”Hostning” och uppträdanden Bindningar och metadata

Andra koncept Migrering eller integration Monitorering Säkerhet Transaktioner Köhantering

Page 76: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Monitorering Loggning Tracing Performance Counters Event Logging WMI

Page 77: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Loggning<system.serviceModel> <diagnostics> <messageLogging logEntireMessage="true" maxMessagesToLog="300" logMessagesAtServiceLevel="true" logMalformedMessages="true" logMessagesAtTransportLevel="false" /> </diagnostics></system.serviceModel><system.diagnostics> <sources> <source name="System.ServiceModel.MessageLogging"> <listeners> <add name="MyListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="C:\logs\ClientTraces.e2e" traceOutputOptions="None" /> </listeners> </source> </sources></system.diagnostics>

Page 78: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Tracing Källor

System.Security.Authorization Microsoft.InfoCards.Diagnostics System.IO.Log System.Runtime.Serialization System.ServiceModel Microsoft.TransactionsBridgs.Dtc

Nivåer All, Off Critical, Error, Warning Information, Verbose ActivityTracing

Page 79: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Slå på räknare per service Kan sättas i machine.config

Kan analyseras på fyra nivåer ServiceHost Endpoint Operation (AppDomain)

<configuration> <system.serviceModel> <diagnostics performanceCountersEnabled="true"/> </system.serviceModel></configuration>

“Performance Counters”

Page 80: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Agenda Vad är WCF Programmera WCF

Kontrakt ”Hostning” och uppträdanden Bindningar och metadata

Andra koncept Migrering eller integration Monitorering Säkerhet Transaktioner Köhantering

Page 81: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Säkerhet och WCF Säkerheten i WCF erbjuder två saker

Säker överföring av meddelanden mellan entiteter

Begränsa åtkomst till resurser från entiteter

Entitet Person, företag, applikation

Resurs Fil, tjänst, operation

Page 82: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Säkerhet för meddelanden Konfidentiell Integritet Autentisering Auktorisering

Loggning

Page 83: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Vitsord – “Credentials” Utsagor – “Claims”

Information om en entitet Används för att kontrollera åtkomst

till resuser Utfärdare – “Issuer”

Certifierar utsagor i vitsord Bevis på ägandeskap – ”Proof of

possession” Hur en enitet bevisar sina utsagor

Page 84: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Säkerhetsmodellen i WCF Baseras på vitsord och utsagor

Kan erbjuda önskade krav på säkerhet

Säkert som grundinställning Utom vid interoperabilitet BasicHttpBinding

Konsekvent mellan inställningar (bindningar)

Konsekvent mellan vitsord

Page 85: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Säkerhet på transportnivå Säkerhetskraven erbjuds på

transportlagret Fördelar

Bra prestanda Vanlig implementation Små förändringar

Nackdelar Begränsad uppsättning utsagor Ingen säkerhet utanför “tråden”

Page 86: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Säkerhet på transportnivå<endpoint address="https://localhost/calculator" binding="basicHttpBinding" bindingConfiguration=”SSLBinding" contract="ICalculator" />

<basicHttpBinding> <binding name="SSLBinding"> <security mode="Transport"> <transport clientCredentialType="None"/> </security> </binding></basicHttpBinding>

Page 87: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Säkerhet på meddelanden Säkerhetskraven erbjuds på

meddelandelagret Fördelar

Stöd för fler typer av utsagor Utbyggbart Säkerhet från “början till slut”

Nackdelar Standards och användning

konsolideras fortfarande Viss påverkan på prestandan

Page 88: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Säkerhet på meddelandenivå<endpoint address="http://localhost/calculator" binding=”wsHttpBinding" bindingConfiguration=”WSBinding" contract="ICalculator" />

<wsHttpBinding> <binding name=”WSBinding"> <security mode=”Message"> <message clientCredentialType=”Windows"/> </security> </binding></wsHttpBinding>

Page 89: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

“Mixed Mode” Kompromiss mellan säkerhet på

transport- och meddelande-nivån Transportnivån erbjuder

integritet och konfidentiallitet Fördelar för prestandan

Meddelandenivån hanterar utsagor Rika “vitsord”, utbyggbart

Page 90: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

“Mixed Mode”<endpoint address="https://localhost/calculator" binding=”wsHttpBinding" bindingConfiguration=”MixedBinding" contract="ICalculator" />

<wsHttpBinding> <binding name=”MixedBinding"> <security mode=” TransportWithMessageCredential"> <message clientCredentialType=”Windows"/> </security> </binding></wsHttpBinding>

Page 91: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Användarnamn/lösenord

Console.WriteLine(" Enter username[domain\\user]:");string username = Console.ReadLine();Console.WriteLine(" Enter password:");string password = Console.ReadLine();

CalculatorProxy wsProxy = new CalculatorProxy();wsProxy.ChannelFactory.Credentials. UserName.UserName = username;wsProxy.ChannelFactory.Credentials. UserName.Password = password;

Page 92: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

“Impersonation”[OperationBehavior( Impersonation=ImpersonationOption.Required)]public double Sub(int a, int b){ return a - b;}

public double Add(int a, int b){ using (ServiceSecurityContext.Current. WindowsIdentity.Impersonate()) { return a + b; }}

Page 93: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

“PrincipalPermission”[PrincipalPermission(SecurityAction.Demand, Role="Builtin\\Administrators")]public double Mul(int a, int b){ return a * b;}

<behaviors> <behavior name="BuiltinSecurity"> <serviceAuthorization principalPermissionMode="UseWindowsGroups"/> </behavior></behaviors>

Page 94: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Agenda Vad är WCF Programmera WCF

Kontrakt ”Hostning” och uppträdanden Bindningar och metadata

Andra koncept Migrering eller integration Monitorering Säkerhet Transaktioner Köhantering

Page 95: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Transaktioner Atomiska eller kompenserande

Välj mellan koppling eller komplexitet Atomiska transaktioner

Enklare att utveckla Negativ påverkan på prestandan “Tightare”-koppling

Kompenserande aktivitet Mer komplex att utveckla Bättre prestanda “Lösare”-koppling

Välj modell baserat på situationen

Page 96: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Transaktioner

[ServiceContract]public interface IMyContract{ [OperationContract] [TransactionFlow(TransactionFlowOption.Required)] bool Transfer1(Account from, Account to, decimal amount);

[OperationContract] [TransactionFlow(TransactionFlowOption.NotAllowed)] bool Transfer2(Account from, Account to, decimal amount);

}

Delta i en transaktion

Page 97: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Transaktioner

public class MyService: IMyContract{ [OperationBehavior( TransactionScopeRequired = true, TransactionAutoComplete = true)] public bool Transfer1( Account from, Account to, decimal amount) { ... } [OperationBehavior( TransactionScopeRequired = true, TransactionAutoComplete = false)] public bool Transfer2( Account from, Account to, decimal amount) { ... OperationContext.Current.SetTransactionComplete(); } }

Utvecklaren av tjänsten

Page 98: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Transaktioner

TransactionScope transaction;using (scope = new TransactionScope()){ proxyOne.Transfer1(AccountOne, AccountTwo, amount); proxyTwo.Transfer1(AccountThree,AccountFour,amount); UpdateLocalCache(AccountOne, AccountTwo, amount); scope.Complete(); }

Använda transaktioner Klientsidan

Page 99: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Transaktioner

<bindings> <wsHttpBinding> <binding name="SampleBinding“ transactionFlow=“true" /> </binding> </wsHttpBinding></bindings>

Kontroll av transaktioner Administratören av tjänsten

Page 100: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Agenda Vad är WCF Programmera WCF

Kontrakt ”Hostning” och uppträdanden Bindningar och metadata

Andra koncept Migrering eller integration Monitorering Säkerhet Transaktioner Köhantering

Page 101: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Hur fungerar köer?

Meddelande M

edde

land

e

Klient Tjänst

“Queue”“Queue”

Page 102: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Köer Förbättrar tillgängligheten

Döljer åtkomst till tjänst eller nätverk Stöd för utskalning

Flera läsare från en kö Erbjuder lastbalansering

Buffrar meddelanden för senare hantering

Är en av byggstenarna för kompenserande aktiviteter

Page 103: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Hur köer fungerar!

Meddelande Meddelande

Klient Tjänst

“Dead LetterQueue”

“Queue”

“Poison Queue”

“Queue”

Page 104: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

“Queue Endpoint”<endpoint address ="net.msmq://MyServer/private/MyQueue/”" binding="netMsmqBinding" bindingConfiguration ="MyQueueBinding" contract="IPurchaseOrder" />

Page 105: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Integrera med ASP.NET HttpContext.Current som i ASMX Värden måste vara IIS 5.1, 6 eller

WAS Bara för transport över HTTP[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)][ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]internal class TallyService: ITally { long ITally.Tally(int value) { long? currentTally = (long?)HttpContext.Current.Session["Tally"]; if(currentTally == null)currentTally = 0; currentTally++; HttpContext.Current.Session["Tally"] = currentTally++; return currentTally; }}

Page 106: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Integrera med ASP.NET Slå på i konfigurationen

Web.config<system.serviceModel> <services> <service name="HostedService.TallyService, HostedService"> <endpoint address="" binding="basicHttpBinding" contract="HostedService.ITally, HostedService"/> </service> </services> <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/></system.serviceModel>

Page 107: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Integrera med ASP.NET På klientsidan<system.serviceModel> <client> <endpoint name="TallyService" address="http://x.se/TallyService/Service.svc" binding="customBinding” bindingConfiguration="AllowCookieBinding" contract="HostedService.ITally, Client"/> </client> <bindings> <customBinding> <binding name="AllowCookieBinding"> <httpTransport allowCookies="true"/> </binding> </customBinding> </bindings></system.serviceModel>

Page 108: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

“ASP.NET Providers” Medlemskap

Existerar en användare? Har användaren specificerat korrekta

“vitsord”

Rollhantering Tillhör användaren en specifik grupp? Vilka grupper tillhör användaren?

Page 109: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

RoleProviderpublic abstract class RoleProvider{ public abstract void CreateRole(string roleName); public abstract bool DeleteRole(string roleName, bool throwOnPopulatedRole); public abstract bool RoleExsts(string roleName); public abstract string[] GetAllRoles(); public abstract void AddUsersToRoles( string[] userNames, string[] roleNames); public abstract void RemoveUsersFromRoles( string[] usernames, string[] roleNames); public abstract string[] GetUsersInRole( string roleName); public abstract string[] FindUsersInRole( string roleName, string usernameToMatch); public abstract string[] GetRolesForUser( string userName); public abstract bool IsUserInRole( string username, string roleName);}

Page 110: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Arkitekturen[PrincipalPermissionAttribute( SecurityAction.Demand, Role="Supervisor")]public void MyMethod(string input){...}

Din kod

Konfiguration

Val av lagring och administration

<system.web> <roleManager enabled="true” defaultProvider="AuthorizationManagerRoleProvider"> <providers> <add name="AuthorizationManagerRoleProvider" type="AuthorizationManagerRoleProvider, Service" description="Role Provider to Authorization Manager" store="msxml://C:\apps\RoleProvider\AuthorizationStore.xml" applicationName="RoleProvider"/> </providers> </roleManager></system.web>

Page 111: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

Resurser Webbsidor

http://wcf.netfx3.com Bloggar

http://blogs.msdn.com/craigmcmurtry/

http://pluralsight.com/blogs/dbox/ Böcker och tidskrifter

Programming ”Indigo” MSDN Magazine

Page 112: Välkommen till Sommarkollo 2006 Windows Communication Foudnation
Page 113: Välkommen till Sommarkollo 2006 Windows Communication Foudnation

http://blogs.msdn.com/[email protected]