Title: MSDN%20Update%20-%20WCF
12006
Välkommen till Sommarkollo 2006 Windows
Communication Foudnation
2Windows Communication Foundation
3Agenda
- Vad är WCF
- Programmera WCF
- Kontrakt
- Hostning och uppträdanden
- Bindningar och metadata
- Andra koncept
- Migrering eller integration
- Monitorering
- Säkerhet
- Transaktioner
- Köhantering
4Hur ser det ut idag?
J2EE
Microsoft
JAX-RPC
ASMX / WSE
RMI
Remoting
CORBA
DCOM
EJB
Enterprise Services
JMS
System.Messaging
Sockets
Sockets
5WCF 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
6Lite om generiska klasser
- 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()
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
7Utan generiska klasser
- Hur kul är det här egentligen?
public class IntegerStack int items
public void Push(int item) public int
Pop()
public class StringStack string items
public void Push(string item) public
string Pop()
8Med generiska klasser
public class StackltTgt //T är generisk
typparameter T items public void
Push(T item) public T Pop()
Stackltintgt integerStack new Stackltintgt()
integerStack.Push(1) Stackltstringgt stringStack
new Stackltstringgt() stringStack.Push(Hello,
World!)
9Detaljer
- Flera typer vid definition
- Använda aliaser
- Begränsningar
public class PointltX,Ygt Pointltint,intgt point
null
using IntegerPoint Pointltint,intgt IntegerPoint
point null
public class StackltTgt where T IComparable public
class NodeltTgt where T new() private T
item new T()
10Mer detaljer
- Kan bara konvertera typparametrar till
interface - Ärva från en generisk klass
class MyClassltTgt void SomeMethod(T t)
ISomeInterface something
(ISomeInterface)t SomeClass
somethingElse (SomeClass)t //Error!
public BaseClassltTgt public ChildClass
BaseClassltstringgt
11Mer detaljer
public class MyClass public void
MyMethodltTgt(T t) MyClass
instance new MyClass() instance.MyMethod(3) in
stance.MyMethod(Hello, World)
12Klienter och tjänster
Klient
Tjänst
13Endpoints
Klient
Tjänst
Endpoint
Endpoint
Endpoint
Endpoint
- Endpoints exponerar funktionalitet
14Adress, Bindning, Kontrakt
Klient
Tjänst
C
B
A
A
B
C
C
B
A
C
B
A
- Endpoints exponerar funktionalitet
- Adress beskriver VART!
- Bindning beskriver HUR!
- Kontrakt beskriver VAD!
15Metadata
WSDL
Klient
Tjänst
C
B
A
A
B
C
C
B
A
C
B
A
- Endpoints exponerar funktionalitet
- Adress beskriver VART!
- Bindning beskriver HUR!
- Kontrakt beskriver VAD!
- WSDL beskriver endpoints
16Uppträdanden
WSDL
Klient
Tjänst
C
B
A
A
B
C
C
B
A
C
B
A
U
U
U
- Uppträdanden beskriver exempelvis
- Instansiering och aktivering
- Sessionshantering
- Transaktioner
17Definition av kontrakt och tjänst
ServiceContract public interface IHello
OperationContract string Hello(string
name)
public class HelloService IHello public
string Hello(string name) return
"Hello, " name
18Hostning av tjänsten
- I en egen applikation
- IIS/WAS (http//localhost/HelloService/HelloServ
ice.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()
lt_at_ ServiceHost LanguageC
ServiceHelloService gt
19Konfiguration
lt?xml version"1.0" encoding"utf-8"
?gt ltconfigurationgt ltsystem.serviceModelgt
ltservicesgt ltservice name"HelloService"gt
ltendpoint address"http//localhos
t/HelloService" binding"basicHttpBindin
g" contract"IHello" /gt
lt/servicegt lt/servicesgt lt/system.serviceModel
gt lt/configurationgt
20Implementera klienten
static void Main() IHello proxy new
ChannelFactoryltIHellogt
("HelloEndpoint").CreateChannel() string r
proxy.Hello("Beat") Console.WriteLine(r)
ltsystem.serviceModelgt ltclientgt ltendpoint
name"HelloEndpoint" address"http//localho
st/HelloService" binding"basicHttpBinding"
contract"IHello" /gt lt/clientgt lt/system.
serviceModelgt
21Arkitektur för dagen
22Arkitektur för dagen
Grundläggande
23StoreService
- Vår samlingstjänst där allting händer
24Agenda
- Vad är WCF
- Programmera WCF
- Kontrakt
- Hostning och uppträdanden
- Bindningar och metadata
- Andra koncept
- Migrering eller integration
- Monitorering
- Säkerhet
- Transaktioner
- Köhantering
25Kontrakt
- Strukturella Structural
- DataContract
- MessageContract
- Agerande Behavioral
- ServiceContract
- OperationContract
- FaultContract
26DataContract
- Oberoende av OO-åtkomstnivåer
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
27DataContract
DataContract public class LibraryCatalog
DataMember System.Collections.Hashtable
catalog
28DataContract
- Använda KnownType-attributet
DataContract KnownType(typeof(Book)) KnownTyp
e(typeof(Magazine)) public class
LibraryCatalog DataMember System.Collections
.Hashtable catalog DataContract public
class Book DataContract public class
Magazine
29DataContract
- Vid osäkerhet av datatyper
DataContract KnownType(typeof(Book)) KnownTyp
e(typeof(Magazine)) public class
PublishedItem DataMember object
catalog DataMember DateTime
publicationDate DataContract public class
Book DataContract public class Magazine
30DataContract
DataContract public class Car
DataMember(IsRequired true) public string
Model DataMember(IsRequired false)
//default public int HorsePower
31DataContract
- Versionshantering, planera i förväg
DataContract public class Person
IExtensibleDataObject public virtual
ExtensionDataObject UnknownData get
return this.unknownData set
this.unknownData value
DataMember public string fullName
private ExtensionDataObject unknownData
32MessageContract
- För skräddarsydda SOAP-headers
- Vilket inte rekommenderas
DataContract public class PurchaseOrder
... MessageContract public class
PurchaseOrderMessage MessageHeader
public int Number MessageBody(Order 1)
public PurchaseOrder Order
33ServiceContract
- Kontrollerar hur strukturella kontrakt
serialiseras
ServiceContract DataContractFormat(
StyleOperationFormatStyle.Document) //Or
Rpc public interface IOrderEntry
... ServiceContract XmlSerializerFormat(
StyleOperationFormatStyle.Document,
UseOperationFormatUse.Literal) //Or
Encoded public interface IOrderEntry ...
34ServiceContract
ServiceContract(Session true,
CallbackContract typeof(IOrderEntryCallback)) p
ublic interface IOrderEntry
OperationContract(IsOneWay true) void
PlaceOrder(PurchaseOrder order) ServiceContra
ct public interface IOrderEntryCallback
OperationContract(IsOneWay true) void
PlaceOrderCompleted( PurchaseOrderStatus
orderStatus)
35ServiceContract
- Arv
- Används vid versionshantering
- Även vid flera kontrakt vid en endpoint
ServiceContract public interface IOrderEntry
OperationContract(IsOneWay true) void
PlaceOrder(PurchaseOrder order) ServiceContra
ct public interface IExtendedOrderEntry
IOrderEntry OperationContract
PurchaseOrder GetOrder(String orderIdentifier)
36ServiceContract
- Implementation
- En implementation av ett interface
- Klassen kallas då Service Type
ServiceContract public interface IOrderEntry
OperationContract(IsOneWay true) void
PlaceOrder(PurchaseOrder order) internal
class OrderEntryService IOrderEntry void
IOrderEntry.PlaceOrder(PurchaseOrder order)
//Your code goes here
37OperationContract
- Exponera metoder
- Egenskapen Action
ServiceContract public interface IOrderEntry
OperationContract(IsOneWay true) void
PlaceOrder(PurchaseOrder order)
ServiceContract public interface
IOrderEntry OperationContract(
Action"http//contoso.com/GetOrder",
ReplyAction"http//contoso.com/GetOrderReply")
PurchaseOrder GetOrder(String orderIdentifier)
38OperationContract
- Rekommendation
- Använd Action som en generell funktion
ServiceContract public interface MyContract
OperationContract(IsOneWay true,
Action"urncrudinsert") void
ProcessInsertMessage(Message message)
OperationContract(IsOneWay true,
Action"urncrudupdate") void
ProcessUpdateMessage(Message message)
OperationContract(IsOneWay true,
Action"urncruddelete") void
ProcessDeleteMessage(Message message)
OperationContract(IsOneWay true, Action"")
void ProcessUnrecognizedMessage(Message
message)
39OperationContract
ServiceContract public interface IMath
OperationContract int Add(int I, int j)
ServiceContract public interface IMath
OperationContract(AsyncPattern true)
IAsyncResult BeginAdd( int i, int j,
AsyncCallback cb, object o) int
EndAdd(IAsyncResult result)
40FaultContract
DataContract class MyFault DataMember
public string Reason null ServiceContract
public interface IOrderEntry
OperationContract FaultContract(typeof(MyFa
ult)) 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 FaultExceptionltMyFaul
tgt(theFault)
41FaultContract
DataContract(Name"MyFault") public class
ClientFault DataMember string Reason
null ... try PurchaseOrder order
Service.GetOrder(orderId) catch
(FaultExceptionltClientFaultgt clientFault)
Console.WriteLine(clientFault.Detail.Reason)
42Programmera kontrakt
ServiceContract public class OrderEntry
OperationContract(IsOneWay true) public
void PlaceOrder(PurchaseOrder order)
return
ServiceContract public interface IOrderEntry
OperationContract(IsOneWay true) void
PlaceOrder(PurchaseOrder order) public class
OrderEntry IOrderEntry public void
PlaceOrder(PurchaseOrder order)
return
43WCF och WSDL
- WSDL kontrakt genereras i flera filer
- Använder ltwsdlimport.../gt
- Scheman separeras alltid från tjänsten
- ltwsdldefinitionsgt
- ltwsdlportType.../gt
- ltwsdlbinding.../gt
- ltwsdlservice.../gt
ServiceContract(Namespace"urngadgets-org") pub
lic interface MyServiceContract
ltendpoint name"MyServiceEndpoint" bindingNa
mespace"http//myservice.com/binding"
ServiceBehavior(Namespace"urnmy-unique-namespac
e2") public class MyService IMyService
44Agenda
- Vad är WCF
- Programmera WCF
- Kontrakt
- Hostning och uppträdanden
- Bindningar och metadata
- Andra koncept
- Migrering eller integration
- Monitorering
- Säkerhet
- Transaktioner
- Köhantering
45Hosting - 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()
46Hosting - Implementation
- I hanterad Windows Service
- Processens livslängd kontrolleras av OS
- Inbyggd Service Control Manager
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()
47Hosting - Implementation
- 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
lt_at_ ServiceHost LanguageC
ServiceMyNamespace.LenderService gt
48Uppträdanden
- Vid utveckling
- Instansiering
- Concurrency
- Throttling
- Transactions
- Vid driftsättning
49Instansiering
- .PerCall
- En instans per anrop
- .PerSession, .Shareable
- En instans per session
- .Single
- En instans per tjänst
ServiceContract public interface IEcho
ServiceBehavior(InstanceContextMode
InstanceContextMode.Single) internal class
MyService IEcho
50Instansiering
- .Single
- Med ytterligare konstruktorer
ServiceContract public interface IEcho ...
ServiceBehavior(InstanceContextModeInstanceCo
ntextMode.Single) internal class MyService
IEcho private string myData null
private MyService() internal
MyService(string startUpData)
this.myDatastartUpData ... public
class MyHost MyService service new
MyService(The initial data)
using(ServiceHost host new ServiceHost(service))
...
51Instansiering
ServiceContract ServiceBehavior(InstanceContext
Mode InstanceContextMode.PerSession) publi
c 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(Re
leaseInstanceMode ReleaseInstanceMode.A
fterCall) public void Clear() this.sum
0
52Concurrency
- 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
ServiceContract public interface IEchoContract
... ServiceBehavior(ConcurrencyMode
ConcurrencyMode.Multiple) public class
EchoService IEchoContract ...
53Throttling
- Kan användas för att begränsa last
- Samtidiga anrop, instanser, kopplingar
ServiceBehavior(ConcurrencyMode
ConcurrencyMode.Multiple) public class MyService
...
ltbehaviorsgt ltbehaviorgt ltthrottling
maxConcurrentCalls"2"
maxConnections"10"
maxInstances"10"/gt lt/behaviorgt lt/behaviorsgt
54Agenda
- Vad är WCF
- Programmera WCF
- Kontrakt
- Hostning och uppträdanden
- Bindningar och metadata
- Andra koncept
- Migrering eller integration
- Monitorering
- Säkerhet
- Transaktioner
- Köhantering
55Bindningar
- En bindning består av
- Transport
- Encoding
- Protokoll
- Tre sätt att konfigurera
- Använd en standard
- Anpassa en standard
- Skapa en skräddarsydd
56Bindningar
- En bindning består av
- Transport
- Encoding
- Protokoll
- Transport
- HTTP
- TCP
- NamedPipe
- MSMQ
57Encoding
- 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
58MTOM Encoding
- Implementation i WCF
- Välj helt enkelt MTOM som encoding
- Alla byte och strömmar kommer att MTOMas
ltbindingsgt ltwsHttpBindinggt ltbinding
name"MTOMBinding" messageEncoding"Mtom"/gt
lt/wsHttpBindinggt lt/bindingsgt
59Protokoll
- Kan innehålla
- WS-Security
- WS-ReliableMessaging
- WS-Coordination och Transaction
60Bindningar
Interoperabiliet Säkerhet Session Transaktioner Duplex
BasicHttpBinding BP 1.1 T S
WsHttpBinding WS T S X X
WsDualHttpBinding WS S X X X
NetTcpBinding .NET T S X X X
NetNamedPipeBinding .NET T X X X
NetMsmqBinding .NET T S X
CustomBinding
- T SSL/TLS S WS-Security O One-Way Only
61Att välja bindning
62Bindningar Standard
lt?xml version"1.0" encoding"utf-8"
?gt ltconfigurationgt ltsystem.serviceModelgt
ltservicesgt ltservice name"MathService"gt
ltendpoint address"http//localhost
/MathEndpoint" binding"wsHttpBinding"
contract"IMathService" /gt
lt/servicegt lt/servicesgt lt/system.serviceModel
gt lt/configurationgt
OBS Liten bokstav på bindning i konfiguration
63Bindningar Anpassa
ltconfigurationgt ltsystem.serviceModelgt
ltservicesgt ltservice name"MathService"gt
ltendpoint addresshttp//localhost/
MathEndpoint" binding"wsHttpBinding"
bindingConfiguration"MTOMOption"
contract"IMath"/gt lt/servicegt
lt/servicesgt ltbindingsgt ltwsHttpBindinggt
ltbinding name"MTOMOption"
messageEncoding"Mtom"/gt lt/wsHttpBindinggt
lt/bindingsgt lt/system.serviceModelgt lt/configura
tiongt
64Bindningar Skapa egna
public static void Main(string args)
ServiceHost host new ServiceHost(typeof(MathServ
ice), "net.tcp//localhost/8080/MathServic
e/") ReliableSessionBindingElement r new
ReliableSessionBindingElement()
r.AdvancedFlowControl true
SecurityBindingElement s
AsymmetricSecurityBindingElement.CreateKerberosBin
ding() TcpTransportBindingElement t new
TcpTransportBindingElement()
t.MaxMessageSize long.MaxValue
BinaryMessageEncodingBindingElement e
new BinaryMessageEncodingBindingElement()
CustomBinding binding new CustomBinding(new
BindingElementr,s,t,e) EndpointAddress
address "net.tcp//localhost/8080/Math/"
host.AddEndpoint(typeof(IMath), binding,
address) host.Open()
65Bindningar Skapa egna
lt?xml version1.0 encodingUTF-8
?gt ltconfigurationgt ltsystem.serviceModelgt
ltbindingsgt ltcustomBindinggt ltbinding
name"MyCustomBinding"gt
ltreliableSession enableFlowControl"true"/gt
ltsecurity authenticationMode"Kerberos"/gt
ltbinaryMessageEncoding /gt
lttcpTransport maxReceivedMessageSize
..." /gt lt/bindinggt
lt/customBindinggt lt/bindingsgt
lt/system.serviceModelgt lt/configurationgt
66Adresser
- Adresser exponerar transportsätt
- http//x.se80/Service/MyEndPoint
- net.tcp//x.se8080/Service/MyEndPoint
- net.pipe//x.se/Service/MyEndPoint
- net.msmq//x.se/MyQueue
67Adresser
- 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//localhost8000/EchoService
"))) host.Open()
Console.ReadLine() host.Close()
ltservice nameEchoService"gt ltendpoint
address"Echo" binding"basicHttpBinding"
contract"IEcho"/gt lt/servicegt
68Adresser
- Hostning i IIS eller WAS
- Adressen är URL för .SVC fil
- Ex http//localhost/MyService/Service.svc
ltconfigurationgt ltsystem.serviceModelgt
ltservicesgt ltservice name"Program"gt
ltendpoint address""
binding"basicHttpBinding"
contract"IEcho"/gt lt/servicegt
lt/servicesgt lt/system.serviceModelgt lt/configurati
ongt
69Klienter
- Med kod, metod 1
- One-off In-line Proxy
using System.ServiceModel namespace MyNamespace
public interface IEcho string
Echo(string input) public class
Program public static void
Main(string arguments) IEcho
proxy new ChannelFactoryltIEchogt
("EchoService").CreateChannel()
Console.WriteLine(proxy.Echo(Ping"))
((IChannel)proxy).Close()
70Klienter
- Med kod, metod 2
- Återanvändbar klass-proxy
using System.ServiceModel ServiceContract publi
c interface IEchoService OperationContract
string Echo(string input) internal class
EchoServiceClient ClientBaseltIEchoServicegt,
IEchoService public EchoServiceClient(string
configurationName) base(configurationNam
e) 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()
71Klienter
ltsystem.serviceModelgt ltclientgt
ltendpoint name"EchoService"
addresshttp//localhost8000/EchoService/Echo"
binding"basicHttpBinding"
contract"MyNamespace.IEcho"/gt
lt/clientgt lt/system.serviceModelgt
72Arkitektur för dagen
Med Callback
73IAdminService
74Agenda
- Vad är WCF
- Programmera WCF
- Kontrakt
- Hostning och uppträdanden
- Bindningar och metadata
- Andra koncept
- Migrering eller integration
- Monitorering
- Säkerhet
- Transaktioner
- Köhantering
75Migrering eller samexistens
Uppgradering
76ASMX till WCF
using System.Web.Services public class
AccountingOperation public string
AccountName public long Amount
public class Accounting
WebMethod(TransactionOptionTransactionOption.Req
uiresNew) public int AddEntry(AccountingOpera
tion debit, AccountingOper
ation credit) // Add entry to
internal accounting book // return
id.
//
using System.ServiceModel
ServiceContract(FormatModeContractFormatMode.Xml
Serializer)
//
OperationContract OperationBehavior(AutoEnlistT
ransactiontrue)
77COM till WCF
using System.EnterpriseServices ComponentAccess
Control SecureMethod Transaction(TransactionOp
tion.Required) SecurityRole("Manager")
//
using System.ServiceModel
//
//
//
public class Accounting ServicedComponent
public void AddCreditEntry(strin
g creditAccount, int creditAmount)
ServiceContract
OperationContract OperationBehavior(AutoEnlistT
ransactiontrue) PrincipalPermission(SecurityAct
ion.Demand, Role"Managers")
//
78WSE till WCF
//
- using Microsoft.Web.Services3
- WebService
- class HelloWorld
-
-
- WebMethod
- public string Hello (string text)
-
- MessageSignature signature (MessageSignature)
- RequestSoapContext.Current.Security.Elements0
- if (!signature.SigningToken.Principal.IsInRole
- ("BUILTIN\Administrators"))
- throw new AuthorizationException("Acce
ss denied") -
- return String.Format("Hello, 0", text)
-
using System.ServiceModel
//
ServiceContract
OperationContract PrincipalPermission(SecurityA
ction.Demand, null, "BUILTIN\Administrators")
//
//
//
//
//
//
79MSMQ till WCF
using System.Messaging
//
using System.ServiceModel ServiceContract
class MyQService public void
ReceiveOrders() MessageQueue Queue
new MessageQueue(_at_".\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) ...
//
//
//
//
//
//
//
//
//
//
//
//
OperationContract(IsOneWay true)
80.NET Remoting till WCF
using System.Runtime.Remoting
Serializable public class AccountingOperation
public string AccountName public long
Amount public class Accounting
public int AddEntry(AccountingOperation
debit, AccountingOperatio
n credit) // Add entry to internal
accounting book // return id.
//
using System.ServiceModel
ServiceContract
MarshalByRefObject
//
OperationContract
81Arkitektur för dagen
Med integration
82Agenda
- Vad är WCF
- Programmera WCF
- Kontrakt
- Hostning och uppträdanden
- Bindningar och metadata
- Andra koncept
- Migrering eller integration
- Monitorering
- Säkerhet
- Transaktioner
- Köhantering
83Monitorering
- Loggning
- Tracing
- Performance Counters
- Event Logging
- WMI
84Loggning
ltsystem.serviceModelgt ltdiagnosticsgt
ltmessageLogging logEntireMessage"true"
maxMessagesToLog"300"
logMessagesAtServiceLevel"true"
logMalformedMessages"true"
logMessagesAtTransportLevel"false" /gt
lt/diagnosticsgt lt/system.serviceModelgt ltsystem.diag
nosticsgt ltsourcesgt ltsource
name"System.ServiceModel.MessageLogging"gt
ltlistenersgt ltadd
name"MyListener" type"System.Diagnost
ics.XmlWriterTraceListener"
initializeData"C\logs\ClientTraces.e2e"
traceOutputOptions"None" /gt
lt/listenersgt lt/sourcegt lt/sourcesgt lt/system.d
iagnosticsgt
85Tracing
- 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
86Performance Counters
- Slå på räknare per service
- Kan sättas i machine.config
- Kan analyseras på fyra nivåer
- ServiceHost
- Endpoint
- Operation
- (AppDomain)
ltconfigurationgt ltsystem.serviceModelgt
ltdiagnostics performanceCountersEnabled"true"/gt
lt/system.serviceModelgt lt/configurationgt
87Agenda
- Vad är WCF
- Programmera WCF
- Kontrakt
- Hostning och uppträdanden
- Bindningar och metadata
- Andra koncept
- Migrering eller integration
- Monitorering
- Säkerhet
- Transaktioner
- Köhantering
88Sä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
89Säkerhet för meddelanden
- Konfidentiell
- Integritet
- Autentisering
- Auktorisering
- Loggning
90Vitsord 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
91Sä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
92Scenarios för säkerhet
93Scenarios för säkerhet
94Sä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
95Säkerhet på transportnivå
ltendpoint address"https//localhost/calculator
" binding"basicHttpBinding"
bindingConfigurationSSLBinding"
contract"ICalculator" /gt ltbasicHttpBindinggt
ltbinding name"SSLBinding"gt ltsecurity
mode"Transport"gt lttransport
clientCredentialType"None"/gt lt/securitygt
lt/bindinggt lt/basicHttpBindinggt
96Sä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
97Säkerhet på meddelandenivå
ltendpoint address"http//localhost/calculator"
bindingwsHttpBinding"
bindingConfigurationWSBinding"
contract"ICalculator" /gt ltwsHttpBindinggt
ltbinding nameWSBinding"gt ltsecurity
modeMessage"gt ltmessage clientCredentialTyp
eWindows"/gt lt/securitygt
lt/bindinggt lt/wsHttpBindinggt
98Mixed 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
99Mixed Mode
ltendpoint address"https//localhost/calculator
" bindingwsHttpBinding"
bindingConfigurationMixedBinding"
contract"ICalculator" /gt ltwsHttpBindinggt
ltbinding nameMixedBinding"gt ltsecurity
mode TransportWithMessageCredential"gt
ltmessage clientCredentialTypeWindows"/gt
lt/securitygt lt/bindinggt lt/wsHttpBindinggt
100Användarnamn/lösenord
Console.WriteLine(" Enter usernamedomain\\user
") string username Console.ReadLine() Console.
WriteLine(" Enter password") string password
Console.ReadLine() CalculatorProxy wsProxy
new CalculatorProxy() wsProxy.ChannelFactory.Cred
entials. UserName.UserName
username wsProxy.ChannelFactory.Credentials.
UserName.Password password
101Impersonation
OperationBehavior( ImpersonationImpersonatio
nOption.Required) public double Sub(int a, int
b) return a - b public double Add(int
a, int b) using (ServiceSecurityContext.Curr
ent. WindowsIdentity.Impersonate())
return a b
102PrincipalPermission
PrincipalPermission(SecurityAction.Demand,
Role"Builtin\\Administrators") public double
Mul(int a, int b) return a
b ltbehaviorsgt ltbehavior name"BuiltinSecurit
y"gt ltserviceAuthorization
principalPermissionMode"UseWindowsGroups"/gt
lt/behaviorgt lt/behaviorsgt
103Arkitektur för dagen
Med säkerhet
104Agenda
- Vad är WCF
- Programmera WCF
- Kontrakt
- Hostning och uppträdanden
- Bindningar och metadata
- Andra koncept
- Migrering eller integration
- Monitorering
- Säkerhet
- Transaktioner
- Köhantering
105Transaktioner
- 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
106Transaktioner
ServiceContract public interface IMyContract
OperationContract TransactionFlow(Transactio
nFlowOption.Required) bool Transfer1(Account
from, Account to, decimal amount)
OperationContract TransactionFlow(Transaction
FlowOption.NotAllowed) bool Transfer2(Account
from, Account to, decimal amount)
107Transaktioner
public class MyService IMyContract
OperationBehavior( TransactionScopeRequired
true, TransactionAutoComplet
e true) public bool Transfer1( Account
from, Account to, decimal amount) ...
OperationBehavior( TransactionScopeRequired
true, TransactionAutoComplet
e false) public bool Transfer2( Account
from, Account to, decimal amount) ...
OperationContext.Current.SetTransactionComplete()
108Transaktioner
- Använda transaktioner
- Klientsidan
TransactionScope transaction using (scope new
TransactionScope()) proxyOne.Transfer1(Account
One, AccountTwo, amount) proxyTwo.Transfer1(Acc
ountThree,AccountFour,amount)
UpdateLocalCache(AccountOne, AccountTwo,
amount) scope.Complete()
109Transaktioner
- Kontroll av transaktioner
- Administratören av tjänsten
ltbindingsgt ltwsHttpBindinggt ltbinding
name"SampleBinding
transactionFlowtrue" /gt lt/bindinggt
lt/wsHttpBindinggt lt/bindingsgt
110Arkitektur för dagen
Transaktion
111Agenda
- Vad är WCF
- Programmera WCF
- Kontrakt
- Hostning och uppträdanden
- Bindningar och metadata
- Andra koncept
- Migrering eller integration
- Monitorering
- Säkerhet
- Transaktioner
- Köhantering
112Hur fungerar köer?
Klient
Tjänst
Queue
Queue
113Kö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
114Hur köer fungerar!
Klient
Tjänst
Dead Letter Queue
Poison Queue
Queue
Queue
115Queue Endpoint
ltendpoint address "net.msmq//MyServer/private/
MyQueue/" binding"netMsmqBinding"
bindingConfiguration "MyQueueBinding"
contract"IPurchaseOrder" /gt
116Arkitektur för dagen
Med köhantering
117Integrera 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.Require
d) 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
118Integrera med ASP.NET
- Slå på i konfigurationen
- Web.config
ltsystem.serviceModelgt ltservicesgt ltservice
name"HostedService.TallyService,
HostedService"gt ltendpoint
address"" binding"basicHttpBinding"
contract"HostedService.ITally,
HostedService"/gt lt/servicegt lt/servicesgt
ltserviceHostingEnvironment
aspNetCompatibilityEnabled"true"/gt lt/system.servi
ceModelgt
119Integrera med ASP.NET
ltsystem.serviceModelgt ltclientgt ltendpoint
name"TallyService"
address"http//x.se/TallyService/Service.svc"
binding"customBinding
bindingConfiguration"AllowCookieBinding"
contract"HostedService.ITally, Client"/gt
lt/clientgt ltbindingsgt ltcustomBindinggt
ltbinding name"AllowCookieBinding"gt
lthttpTransport allowCookies"true"/gt
lt/bindinggt lt/customBindinggt
lt/bindingsgt lt/system.serviceModelgt
120ASP.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?
121RoleProvider
public 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)
122Arkitekturen
- Din kod
- Konfiguration
- Val av lagring och administration
PrincipalPermissionAttribute(
SecurityAction.Demand, Role"Supervisor") public
void MyMethod(string input) ...
ltsystem.webgt ltroleManager enabled"true
defaultProvider"AuthorizationManagerRoleProvider"
gt ltprovidersgt ltadd name"AuthorizationMa
nagerRoleProvider" type"AuthorizationMana
gerRoleProvider, Service"
description"Role Provider to Authorization
Manager" store"msxml//C\apps\RoleProvid
er\AuthorizationStore.xml"
applicationName"RoleProvider"/gt
lt/providersgt lt/roleManagergt lt/system.webgt
123Resurser
- Webbsidor
- http//wcf.netfx3.com
- Bloggar
- http//blogs.msdn.com/craigmcmurtry/
- http//pluralsight.com/blogs/dbox/
- Böcker och tidskrifter
- Programming Indigo
- MSDN Magazine
124(No Transcript)
125http//blogs.msdn.com/johanl
- johan.lindfors_at_microsoft.com