80 likes | 181 Views
Session. Når man hoster en WCF Service på ASP.NET website, kan man bruge ASP.NET’s Session. Implementering af tilgang til ASP.NET session mm for WcfService. using ……….; ………………………….. using System.Web; using System.ServiceModel.Activation; namespace WebApplication {
E N D
Session Når man hoster en WCF Service på ASP.NET website, kan man bruge ASP.NET’s Session
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.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 <system.serviceModel> ……… <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> ………. </system.serviceModel> Man kan på HttpContext.Current også her få tilgang til ASP.NET’s Application objekt (singleton)
Session 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 mere avanceret senere Uddrag af Config filene på windows- / consoleklient (normalt via app.config) <binding name="BasicHttpBinding_I CountService" allowCookies="true" …………… /> Hvis der i klient programmet ønskes en session pr. Proxy skal man desuden sætte user name og password selv om der ikke kræves login for at bruge servicen. SessionCounterWcfServiceClient serviceProxy = new SessionCounterWcfServiceClient(); serviceProxy.ClientCredentials.UserName.UserName = ""; serviceProxy.ClientCredentials.UserName.Password = ""; ........ int c = serviceProxy.Count();
Mere om Session Det næste om session kan man springe over hvis man hoster WCF service på ASP.NET website og vil nøjes med den enkle løsning
Interface med kontrakten 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(SessionMode = SessionMode.Required)] usingSystem.ServiceModel.Web; // indeholder ServiceContract og OperationContract klasserne ……….. namespaceMyNamespace { [ServiceContract(SessionMode = SessionMode.Required)] [ServiceContract] // Attribut på interfacet public interface IService1 { [OperationContract] // Attribut på metoder der skal kunne tilgås via servicen (proxyen) stringGetData(intvalue);
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 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 <system.serviceModel> …… <services> <service name="WcfService1.Service1" > <endpoint address="Soap12" contract="WcfService1.IService1" binding="wsHttpBinding"/> </service> </services> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> …… </system.serviceModel> <= Her Defineres selve klassen, der implementere kontrakten <= Her Defineres kontrakten (normal interfacet)
ASP.NET WcfServiceApplication med session Hvis man vil anvende login for at bruge sin service med session fra flere proxy i samme application skal der desuden defineres at man ikke ønsker at der opsættes sikkerhed for servicen definere det vor wsHttpBinding (Sikkerhed udelades i denne runde) Uddrag af Web.Config for at bruge Session i en WcfServiceApplication <system.serviceModel> …… <bindings> <wsHttpBinding> <binding name=""> <security mode="None"> <message establishSecurityContext="false" /> </security> <reliableSession enabled="true"/> </binding> </wsHttpBinding> </bindings> …… </system.serviceModel>
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 <system.serviceModel> …… <protocolMapping> <add scheme="http" binding="wsHttpBinding" /> </protocolMapping> …… </system.serviceModel>