Sitzungslos/Statuslos

http://www.flickr.com/photos/toofarnorth/8670157331/ Aus der RFC 2616: “It is a generic, stateless, protocol” Das heißt, das Fundament auf dem wir aufsetzen ist Sitzungslos. Wenn das Applikations-Framework, egal ob mit Web Forms oder MVC, oder Python, oder PHP, oder Rails…, das respektiert, wird es den Anforderungen des Web gerecht: Skaliert besser – Ich brauche mir im NLB-Szenario (Network Load Balancing) keine Gedanken über Shared Memory machen oder mit dem ASP.NET State-Server einen SPOF (Single Point of Failure) einführen. Skaliert kostengünstiger – Mit MS SQL-Server kann ich State zwar auch *Hochverfügbar* ablegen. Dazu sind dann aber SAN (Storage Area Network), Glasfaser, Switches, Kable, Blech, Strom, Betrieb-System & SQL-Server-Lizenzen zusätzliche Kostenfaktoren. Ist leichter zu testen – Code der auf State reagiert kann nur getestet werden wenn der State reproduzierbar (im Test) erstellt wird. Tests werden komplizierter. Tests dauern länger – letzten Endes auch ein Kostenfaktor. Ist weniger komplex – Code wird verständlicher und transparenter da State sich wie globale Variablen verhält (http://c2.com/cgi/wiki?GlobalVariablesAreBad). Um mal als Beispiel ein Bild zu malen: Wenn ich eine Rakete bauen will um zum Mond zu Fliegen. Bin ich dann schneller auf dem Mond, wenn ich mich mit Thema  Schwerkraft auseinandersetze? Was ist eigentlich State? Oder besser was ist nicht State? Als State werden meist Daten bezeichnet, die temporär sind – also eine sehr befristete Lebensdauer. Häufig ist das aber eine Frage der Perspektive und Granularität. Beispiel E-Commerce Sind es nicht die Daten, der Produkte im Warenkorb, die früher oder später zu Positionen in einer Bestellung werden? Ja und Nein. Natürlich, es sei denn, der User entscheidet sich NICHT dazu die Bestellen-Schaltfläche zu betätigen. Alternativen Cookies In Cookies kann eine begrenzte Datenmenge (1024kb) auf dem Rechner des Users abgelegt werden. VORSICHT: Der User kann die Datei modifizieren. Nicht dass die Produkte im Warenkorb alle nur noch 0 EUR kosten. Auch sensible Daten (selbst wenn verschlüsselt) würde ich hier nicht ablegen: Stichwort Cookie-Hi-Jacking. Je nach Expiration-Date bleiben die Daten hier auch über mehrere Browser-Sitzungen erhalten. HTML5 Web Storage Das neue HTML5 API ermöglicht das Speichern von Dateien im sog. Isolated Storage (http://msdn.microsoft.com/en-us/library/3ak841sy(v=vs.80).aspx) einem Benutzerbezogenen lokalen Verzeichnis. Im Gegensatz zu Cookies, die implizit geladen werden ist es schwieriger diese Daten zu hijacken. Hierbei bleiben die Daten über mehrere Browser-Sitzungen erhalten. http://dev.w3.org/html5/webstorage/ HTML5 Indexed Database API Mit HTML5 kommt eine weitere API. Diese ermöglicht das Ablegen indizierter Daten, wie in einer Datenbank z.B. MS SQL Server, im Isolated Storage. Wie beim Web Storage werden auch hier werden die Daten explizit geladen. Auch hierbei bleiben die Daten über mehrere Browser-Sitzungen erhalten. http://www.w3.org/TR/IndexedDB/ Datenbank Wenn Die Daten (Beispiel E-Commerce) sowieso früher oder später zu einer Bestellung werden, könnte man diese doch einfach so behandeln. Alles was dazu benötigt wird ist eine weiter Spalte in der Datenbank-Tabelle namens z.B. „State“ mit den Werten für „Im Warenkorb“ und „Bestellt“. Hierbei ergeben sich zudem tolle Möglichkeiten: Die Daten bleiben (nur für Angemeldete Benutzer) über mehrere Browser-Sitzungen erhalten Auch über Devices hinweg. Für das Reporting: „TOP 10 Produkte im Warenkorb die aber selten verkauft werden“ und „Verhältnis von Im Warenkorb zu Bestellt“. Nichts desto trotz die *Dateileichen* irgendwann mal aufgeräumt. Der MS SQL Server bietet mit dem SQL Server Agent die Möglichkeit in definierten Intervallen Jobs auszuführen: Backups genauso wie Aufräumarbeiten. Im Zweifel tun es aber auch „Scheduled Tasks“ (http://support.microsoft.com/kb/308569) bzw. von der Konsole die at.exe (http://support.microsoft.com/kb/313289) oder einfach CODE.

PHP und WCF Interop Web Cast

Interoperabilität gehört (fast) zu meinem täglichen Brot :-) Und zwischen Web Services ist das ja auch ganz normal. Ich freue mich daher sehr, dass Microsoft das Thema auch auf dem Schirm hat. Mit dem “Evangelist mit dem Hut” habe ich mich vor ein paar Tagen zusammengesetzt und wir haben einen Web Cast aufgenommen. Jan hat danach noch ein Video-Interview mit mir gemacht, was er in seinem Blog gepostet hat.  Web Cast: PHP - WCF Webservice Interoperabilität MSDN TV: Interview Der Evangelist mit dem Hut a.k.a. Jan Schenk

NRW Conf 09

Auch in diesem Jahr veranstaltet der Just Community e.V. wieder das größte Developer und IT-Pro Community Event. Unter dem Motto „Check-In zum Wissensvorsprung“ holen wir am 28.08.2009 zahlreiche nationale und internationale Speaker nach Wuppertal. Neben den Vorträgen haben Sie natürlich auch dieses Jahr wieder viel Zeit für das Networking mit anderen ITlern aus Nah und Fern. Alle Informationen, wie die Agenda und eine Übersicht über die Speaker gibt es unter http://www.nrwconf.de/. Wir freuen uns, Ihnen auch dieses Jahr sowohl bekannte Gesichter, als auch neue Speaker vorstellen zu dürfen. Die Veranstaltung wurde in diesem Jahr möglich durch unsere Sponsoren: Hewlett Packard, devcoach, Microsoft Deutschland, Brockhaus AG, Itemis AG, sepago GmbH, MT AG, sowie weiteren Unternehmen. Eine weitere Neuerung in diesem Jahr ist der Workshop Day, der am Vortag der eigentlichen Konferenz – sprich am 27.08.2009 – in den Räumlichkeiten unseres Sponsoren Ontaris GmbH stattfindet. Der Developer-Workshop befasst sich mit der Microsoft Web Platform und behandelt die Themen Rich Internet Applications mit Silverlight 3.0 und Web 2.0 Applikationen mit ASP.NET AJAX und JQuery. Die Workshops haben eine begrenzte Teilnehmerzahl (je acht) um den Lernerfolg zu garantieren. Also schnell einchecken…

Project Springboard

Am 5. Juni war ich als Sprecher beim “Project Springboard” zu Gast. Dennis Zielke und das Student Partner Team haben ganze Arbeit geleistet und ein Spitzen Event auf die Beine gestellt – nochmal nochmal nochmal! Mein Vortrag “IIS, PHP & WCF – Web Services InterOp” hat wirklich Laune gemacht und ist laut Feedback bester Vortrag der Konferenz – DANKE, IHR WARD EINE SUPER AUDIENCE!!!   Hier nun wie versprochen das Slide und der Code (PHP gehostet über FastCGI im IIS 7.0 ruft über SSL und Basic Athentication einen WCF Service mit einer Complex-SOAP-Message auf…): springbreak_IIS_PHP_und_WCF.zip

WCF Metadata, Proxies and real Proxies

I was just about to generate a client (proxy) for a WCF service on a computer (in a domain) on customer site when svcutil.exe returned the following: Microsoft (R) Service Model Metadata Tool [Microsoft (R) Windows (R) Communication Foundation, Version 3.0.4506.30] Copyright (c) Microsoft Corporation. All rights reserved. Error: Cannot obtain Metadata from http://127.0.0.1/CallahanWeb/service.svc?wsdl If this is a Windows (R) Communication Foundation service to which you have access, please check that you have enabled metadata publishing at the specified address. For help enabling metadata publishing, please refer to the MSDN documentation at http://go.microsoft.com/fwlink/?LinkId=65455. WS-Metadata Exchange Error URI: http://127.0.0.1/CallahanWeb/service.svc?wsdl Metadata contains a reference that cannot be resolved: 'http://127.0.0.1/CallahanWeb/service.svc?wsdl'. <?xml version="1.0" encoding="utf-16"?><Fault xmlns="http://www.w3.org/2003/05/soap-envelope"><Code><Value> Sender </Value><Subcode><Value xmlns:a="http://schemas.xmlsoap.org/ws/2005/02/sc"> a:BadContextToken </Value></Subcode></Code><Reason><Text xml:lang="de-DE">The message could not be processed. This is most likely because the action 'http://schemas.xmlsoap.org/ws/2004/09/transfer/Get' is incorrect or because the message contains an invalid or expired security context token or because there is a mismatch between bindings. The security context token would be invalid if the service aborted the channel due to inactivity. To prevent the service from aborting idle sessions prematurely increase the Receive timeout on the service endpoint's binding.</Text></Reason></Fault> HTTP GET Error URI: http://127.0.0.1/CallahanWeb/service.svc?wsdl The document was understood, but it could not be processed. - The WSDL document contains links that could not be resolved. - There was an error downloading 'http://dpc00000198.clients.eden/CallahanWeb/service.svc?wsdl=wsdl0'. - The request failed with HTTP status 407: Proxy Authentication Required ( The ISA Server requires authorization to fulfill the request. Access to the Web Proxy service is denied. ). If you would like more help, type "svcutil /?" Seems that svcutil does not support http proxies that require authentication... After i disabled the proxy in IE's settings it worked ;-)

TornadoCamp WinFX

thinktecture and newtelligence AG present a week of Windows Communication Foundation (WCF), Windows Presentation Foundation (WPF) and Windows Workflow Foundation (WWF): TornadoCamp WinFX. Christian, Ingo, Michael and me will present from the 16th - 20th of october in Bad Ems in GERMAN!

TornadoCamp WinFX

thinktecture and newtelligence AG present a week of Windows Communication Foundation (WCF), Windows Presentation Foundation (WPF) and Windows Workflow Foundation (WWF): TornadoCamp WinFX. Christian, Ingo, Michael and me will present from the 16th - 20th of october in Bad Ems in GERMAN!

WCF Sample - Attribute driven Constraints

I posted some Bits Michael and I wrote recently in a WCF Project:The Constraints-Extensions let you easily define attribute based limitations for input, output and return parameters. Limitations can be set to service contracts operations as well as to data contract data member implementations. The constraints validation gets called at runtime by the WCF infrastructure and the behavior will throw a ConstraintViolationException with descriptive messages in case of a constraint gets violated/the validation fails. The following constraint attributes have been implemented:BetweenBetweenExclusiveCompareAgainstEarlierThanNowEarlierThanTodayEqualToGreaterEqualToGreaterThanLaterThanNowLaterThanTodayLessEqualToLessThanMatchMaxElementsMaxLengthMinElementsMinLengthNotBetweenNotEmptyNotEqualToNotNullNullableOneOff·     Data Contract Sample: [DataContract]class TestClass{    [DataMember]    [LessEqualTo(CompareAgainst.FieldOrProperty,"EndDate")]    public DateTime StartDate;     [DataMember]    [GreaterEqualTo(CompareAgainst.FieldOrProperty, "StartDate")]    public DateTime EndDate;     public TestClass(DateTime startDate, DateTime endDate)    {        StartDate = startDate;        EndDate = endDate;    }}   Service Contract Sample: [ServiceContract, ConstraintsValidatorBehavior]interface ITestConstraints{     [OperationContract]    [return:GreaterEqualTo(0)]     int MethodA(        [Between(0,100)]         int a,         [LessEqualTo(20)]         double b,         [NotEmpty]         string c);      [OperationContract]    int MethodB(        [Between(0, 100)]         int a,         [LessEqualTo(20)]         ref double b,         [NotEmpty]         out string c);     [OperationContract]    [return:LaterThanNow]    DateTime MethodC(        [GreaterThan(0)]         int a);       [OperationContract]    void MethodD(        [VerifyObject]         TestClass a);} Download at wcf.netfx3.com

WCF Sample - Attribute driven Constraints

I posted some Bits Michael and I wrote recently in a WCF Project:The Constraints-Extensions let you easily define attribute based limitations for input, output and return parameters. Limitations can be set to service contracts operations as well as to data contract data member implementations. The constraints validation gets called at runtime by the WCF infrastructure and the behavior will throw a ConstraintViolationException with descriptive messages in case of a constraint gets violated/the validation fails. The following constraint attributes have been implemented:BetweenBetweenExclusiveCompareAgainstEarlierThanNowEarlierThanTodayEqualToGreaterEqualToGreaterThanLaterThanNowLaterThanTodayLessEqualToLessThanMatchMaxElementsMaxLengthMinElementsMinLengthNotBetweenNotEmptyNotEqualToNotNullNullableOneOff·     Data Contract Sample: [DataContract]class TestClass{    [DataMember]    [LessEqualTo(CompareAgainst.FieldOrProperty,"EndDate")]    public DateTime StartDate;     [DataMember]    [GreaterEqualTo(CompareAgainst.FieldOrProperty, "StartDate")]    public DateTime EndDate;     public TestClass(DateTime startDate, DateTime endDate)    {        StartDate = startDate;        EndDate = endDate;    }}   Service Contract Sample: [ServiceContract, ConstraintsValidatorBehavior]interface ITestConstraints{     [OperationContract]    [return:GreaterEqualTo(0)]     int MethodA(        [Between(0,100)]         int a,         [LessEqualTo(20)]         double b,         [NotEmpty]         string c);      [OperationContract]    int MethodB(        [Between(0, 100)]         int a,         [LessEqualTo(20)]         ref double b,         [NotEmpty]         out string c);     [OperationContract]    [return:LaterThanNow]    DateTime MethodC(        [GreaterThan(0)]         int a);       [OperationContract]    void MethodD(        [VerifyObject]         TestClass a);} Download at wcf.netfx3.com