Title: Distribution af funktionalitet Webservice med WCF
1- Distribution af funktionalitetWebservice med WCF
x
2Different technology combined to form WCF.
http//wcftutorial.net/Introduction-to-WCF.aspx
3ASP.NET - 1 tier distribution
http//msdn.microsoft.com/en-us/library/bb547119.a
spx
4ASP.NET - 2 tier distribution
http//msdn.microsoft.com/en-us/library/bb547119.a
spx
5ASP.NET - n tier distribution
http//msdn.microsoft.com/en-us/library/bb547119.a
spx
6Webservice - SOAP
7Remoting arkitekturServer og klient er begge
.NET
- Generel arkitektur
- Proxy, stub, formattering og channel kan ændres.
Fx er en binær formattering, der både
understøttes af TCP og HTTP, mere effektiv end en
tekstbaseret (XML)
8Remoting service - muligheder
- Server-activated object (SAO)også betegnet
Wellknown objects - Singleton Ét serverobjekt til alle klienter
- Trådproblemer
- SingleCall Ét objekt pr. metodekald
- Nemmeste løsning men mindst effektivt
- Tilstand opretholdes vha. filer eller database
- Client-activated object (CAO)
- Activated Ét objekt pr. klient
- Levetidsproblem Leasing understøttes ikke af IIS
9Windows Communication Foundation Architecture
http//msdn.microsoft.com/en-us/library/ms733128.a
spx
10Hosting WCF Side-by-Side with ASP.NET
http//msdn.microsoft.com/en-us/library/aa702682.a
spx
11WCF understøtter de 3 state senarier
Se evt. også for en anden info om disse 3 på
http//www.codeproject.com/KB/WCF/WCFInstance.aspx
12WCF host og protokol
- Wcf kan som remoting (singleton og singlecall)
integreres i et asp.net web og afvikles på
IISen,hvor wcf desuden kan opnås tilgang til
ASP.NETs Session, Application objekter m.m. - Wcf kan anvendes uden for ISSen med andre
protokoller end http. - Wcf kan understøtte fx json og ikke kun soap,
hvilket ikke let opnås med ASP.NET webservices
13WCF data protokoller
http//msdn.microsoft.com/en-us/library/bb547119.a
spx
14WCF brug
- Service defineres som ServiceContract på
interface / klasse der skal fungere som
service-object, hvor metoder der skal være
tilgængelige externt defineres som
OperationContracts - Transport-objekter defineres som DataContractog
felter/property der skal med som data som
DataMembers. - Wcf kan understøtte fx json og ikke kun soap,
hvilket ikke let opnås med ASP.NET webservices
15Interface med kontrakten
Normalt vil man definere kontrakten på et
Interface, men kan også definere denne på selve
klassen, hvis man ikke ønsker et interface using
System.Runtime.Serialization using
System.ServiceModel using System.ServiceModel.Web
using System.Text namespace MyNamespace
ServiceContract // Attribut på interfacet
public interface IService1
OperationContract // Attribut på metoder der
skal kunne tilgås via servicen (proxyen)
string GetData(int value) Hvis der skal
anvendes session på servicen under en
WcfServiceApplication (kan ikke bruges på ASP.NET
website under ISS) skal ServiceContracten
tilføjes parametre og den ser således ud
ServiceContract(Namespace "http//Microsoft.Ser
viceModel.Samples", SessionMode
SessionMode.Required)
16Implementeringsklassen for kontrakten
- using System.Runtime.Serialization
- using System.ServiceModel
- using System.ServiceModel.Web
- using System.Text
- using System.Web.Services
- using System.Web
- namespace MyNameSpace
-
- //ServiceBehavior(InstanceContextMode
InstanceContextMode.PerCall) - //ServiceBehavior(InstanceContextMode
InstanceContextMode.Single) - //ServiceBehavior(InstanceContextMode
InstanceContextMode.PerSession) - public class Service1 IService1
-
- public string GetData(int value)
-
- return string.Format("You entered
0 lt1gt", value count, s)
17WcfServiceApplication med session
WcfServiceApplication med session på
serviceobject kræver at man får lavet en
wsHttpBinding. Dette kan gøres med en tilføjelse
til Web.Config. Denne løsning gælder ikke for
WebAppication (ASP.NET) der kører på IIS På ISS
kan man heller ikke selv sætte en protokol, den
er givet http Uddrag af Web.Config for at bruge
Session i en WcfServiceApplication ltsystem.servic
eModelgt ltprotocolMappinggt ltadd
scheme"http" binding"wsHttpBinding"
/gt lt/protocolMappinggt lt/system.servi
ceModelgt
18Implementering af tilgang til ASP.NET session mm
for WcfService
using . .. using System.Web using
System.ServiceModel.Activation namespace
WebApplication AspNetCompatibilityRequireme
nts(RequirementsMode AspNetCompatibilityRequir
ementsMode.Required) public class
CountService ICountService
private int count 0 public int
Count() if(HttpContext.Curre
nt.Session"count" ! null)
count (int) HttpContext.Current.Session"count"
count
HttpContext.Current.Session"count" count
return count Der
skal herudover tilføjes aspNetCompatibilityEnabled
"true" til serviceHostingEnvironment elementet i
web.Config Uddrag af web.Config
ltsystem.serviceModelgt ltserviceHostingEnvir
onment multipleSiteBindingsEnabled"true"
aspNetCompatibilityEnabled"true" /gt .
lt/system.serviceModelgt
19ASP.NET WcfServiceApplication med session
Hvis man vil anvende session i selve
serviceklasserne med ServiceBehavior(InstanceCont
extMode InstanceContextMode.PerSession) kan
man definere det som i web.config. Dette gøres
ved at definere sit service endpoint (angives
også i .svc filen) og er endpoint Soap12, sætte
kontrakten og binding til wsHttpBindingDenne
løsning gælder også hvis én session pr. proxy
klasse på klient selv om man bruger ASP.NET
Sessions Uddrag af Web.Config for at bruge
Session i en WcfServiceApplication ltsystem.servic
eModelgt ltservicesgt ltservice
name"WcfService1.Service1" gt ltendpoint
address"Soap12" contract"WcfService1.ISe
rvice1 binding"wsHttpBinding"/gt
lt/servicegt lt/servicesgt ltserviceHostingEnviron
ment multipleSiteBindingsEnabled"true"
aspNetCompatibilityEnabled"true"
/gt lt/system.serviceModelgt
lt Her Defineres selve klassen, der
implementere kontrakten
lt Her Defineres kontrakten (normal
interfacet)
20Data transport objekter (DTO)
Hvis der skal overføres sammensatte objekter
(altså ikke simple typer, string og array) så
skal disse kunne serialiseres dette skal ske
med brug at en DataContract tidligere kunne man
anvende Serializable på Webservice ville kun
blive overført public felter og public property,
svarende til en XML serialisering. using
System.Runtime.Serialization
DataContract // klasse kan serialiseres
public class CompositeType
DataMember // felt skal med bool
_boolValue true string _stringValue
"Hello " DataMember // property
skal med public int EnInt private get
set
21Data transport objekter (DTO)
22Session skal tillades på klientenfor
basicHttpBinding (soap 1.1)
Session skal tillades på klienten der anvender en
wcfService (.svc), en asp.net webservice (.asmx)
eller remotingBemærk at man her kun får én
session for klient-applicationen, hvis man ønsker
én pr. service (proxy) klasse skal man anvende
endpoint og wsHttpBinding for wcf-service se
tidligere slides Uddrag af Config filene på
windows- / consoleklient (normalt via
app.config) ltbinding name"BasicHttpBinding_IRe
gneService" closeTimeout"000100"
openTimeout"000100" receiveTimeout"0010
00" sendTimeout"000100"
allowCookies"true" bypassProxyOnLocal"false"
hostNameComparisonMode"StrongWildcard"
maxBufferSize"65536"
maxBufferPoolSize"524288" maxReceivedMessageSize
"65536"
23IIS skal sættes til ASP.NET v4.0 (mindst)
24Tilføj asynkrone metoderså wcf-/webservice kan
køres i baggrund
25Eksempel på Asynkron kald af Wcf-Service
- delegate void VisIntEvent(int tal)
// nødvendig med - private void VisInt(int tal)
-
- textBox3.Text "" tal
-
-
- // Asynkron kald af WcfService klasse
- private void button1_Click(object sender,
EventArgs e) -
- int a int.Parse(textBox1.Text)
- int b int.Parse(textBox2.Text)
- RegneServiceReference.RegneServiceClie
nt serviceAsync new RegneServiceReference.Regn
eServiceClient() // brug klasse - serviceAsync.AddCompleted
AddCompletedEvent - serviceAsync.AddAsync(a, b)
-
- private void AddCompletedEvent(object
sender, RegneServiceReference.AddCompletedEventArg
s e) -
26Eksempel på Asynkron kald af asmx Web-Service
- delegate void VisIntEvent(int tal)
// nødvendig med - private void VisInt(int tal)
-
- textBox3.Text "" tal
-
- // Asynkron kald af asmx webservice
- private void button2_Click(object sender,
EventArgs e) -
- int a int.Parse(textBox1.Text)
- int b int.Parse(textBox2.Text)
- AsmxWebServiceReference.WebRegneServic
eSoapClient asmxService new
AsmxWebServiceReference.WebRegneServiceSoapClie
nt() // Brug klasse - asmxService.AddCompleted
asmxAddCompletedEvent - asmxService.AddAsync(a,b)
-
- private void asmxAddCompletedEvent(object
sender, AsmxWebServiceReference.AddCompletedEventA
rgs e) -
- int r e.Result //
Bemærk e.Result resultatet