Slides til WCF webservice

Download Report

Transcript Slides til WCF webservice

x

Distribution af funktionalitet Webservice med WCF

Different technology combined to form WCF.

http://wcftutorial.net/Introduction-to-WCF.aspx

ASP.NET - 1 tier distribution http://msdn.microsoft.com/en-us/library/bb547119.aspx

ASP.NET - 2 tier distribution http://msdn.microsoft.com/en-us/library/bb547119.aspx

ASP.NET - n tier distribution http://msdn.microsoft.com/en-us/library/bb547119.aspx

Webservice - SOAP

Remoting – arkitektur Server 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)

Client proxy remoting formatter channel Server stub remoting formatter listener

Remoting 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

Windows Communication Foundation Architecture

http://msdn.microsoft.com/en-us/library/ms733128.aspx

Hosting WCF Side-by-Side with ASP.NET

http://msdn.microsoft.com/en-us/library/aa702682.aspx

WCF 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

WCF host og protokol

• Wcf kan som remoting (singleton og singlecall) integreres i et asp.net web og afvikles på IIS’en, hvor wcf desuden kan opnås tilgang til ASP.NET’s Session, Application objekter m.m.

• Wcf kan anvendes uden for ISS’en med andre protokoller end http.

• Wcf kan understøtte fx json og ikke kun soap, hvilket ikke let opnås med ASP.NET webservices

WCF data protokoller

http://msdn.microsoft.com/en-us/library/bb547119.aspx

WCF 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 OperationContract’s • Transport-objekter defineres som DataContract og felter/property der skal med som data som DataMember’s.

• Wcf kan understøtte fx json og ikke kun soap, hvilket ikke let opnås med ASP.NET webservices

Interface 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] string GetData(int value); // Attribut på metoder der skal kunne tilgås via servicen (proxyen) Hvis der skal anvendes session på servicen under en WcfServiceApplication (kan ikke bruges på ASP.NET – website under ISS) skal ServiceContract’en tilføjes parametre og den ser således ud: [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode = SessionMode.Required)]

Implementeringsklassen 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} <{1}>", value + count, s); } Tilhørende markeup Service1.svc file, der giver bindingen til service1: <%@ ServiceHost Language="C#" Debug="true" Service=“MyNameSpace.Service1" CodeBehind="Service1.svc.cs" %> • • • Default er InstanceContextMode.PerCall (eet nyt service objekt for hver kald) InstanceContextMode.Single (eet service object for hele applicationen – husk trådsikring) InstanceContextMode.PerSession (eet service object for en session) – dette kan ikke bruges når service kører på Internet Information Server ( ISS - WebApplication), hvor man i stedet skal anvende ASP.NET Session (wsHttpBinding)

WcfServiceApplication 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 …… ……

Implementering af tilgang til ASP.NET session mm for WcfService

using ……….; …………………………..

using System.Web; using System.ServiceModel.Activation; namespace WebApplication { [AspNetCompatibilityRequirements(RequirementsMode = { { AspNetCompatibilityRequirementsMode.Required)] public class CountService : ICountService private int count = 0; public int Count() if( HttpContext.Current

++count; HttpContext.Current

.Session["count"] != null) count = (int) HttpContext.Current.Session["count"]; .Session["count"] = count; return count; } ………………………………… Der skal herudover tilføjes aspNetCompatibilityEnabled="true" serviceHostingEnvironment elementet i web.Config

til Uddrag af web.Config

………

/>

ASP.NET WcfServiceApplication med session Hvis man vil anvende session i selve serviceklasserne med ServiceBehavior(InstanceContextMode = 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 wsHttpBinding Denne 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 …… <= Her Defineres selve klassen, der implementere kontrakten <= Her Defineres kontrakten (normal interfacet) ……

Data 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] public class CompositeType { [DataMember] bool _boolValue = true; string _stringValue = "Hello "; [DataMember] public int EnInt {private get; set;} // klasse kan serialiseres // felt skal med // property skal med

Data transport objekter (DTO)

Session skal tillades på klienten for basicHttpBinding (soap 1.1)

Session skal tillades på klienten der anvender en wcfService (.svc), en asp.net webservice (.asmx) eller remoting Bemæ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)

allowCookies="true"

bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"

IIS skal sættes til ASP.NET v4.0 (mindst)

Tilføj asynkrone metoder så wcf-/webservice kan køres i baggrund

Eksempel 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

.RegneService

Client

serviceAsync = new RegneServiceReference.RegneServiceClient(); // brug klasse serviceAsync.AddCompleted += AddCompletedEvent; serviceAsync.AddAsync(a, b); } private void AddCompletedEvent(object sender, RegneServiceReference.AddCompletedEventArgs e) { int r = e.Result

; // Bemærk e.Result resultatet textBox3.Text = "" + r; }

Eksempel 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.

WebRegneServiceSoap Client

asmxService = new AsmxWebServiceReference.WebRegneServiceSoapClient(); asmxService.AddCompleted += asmxAddCompletedEvent; // Brug klasse asmxService.AddAsync(a,b); } private void asmxAddCompletedEvent(object sender, AsmxWebServiceReference.AddCompletedEventArgs e) int r = e.Result

; // Bemærk e.Result resultatet textBox3.Text = "" + r; }