Leistungen
Leistungen
Überblick
Leistungsangebot
Kernkompetenzen
Schulungsthemen
In-House-Schulungen
Offene .NET-Seminare
Offene WPS-Seminare
Beratung
Support
.NET/Visual Studio
TFS/ALM/Scrum
Webprogrammierung
PowerShell
Konditionen
Anfrage/Kontakt
In-House-Schulungen
In-House-Schulungen
Überblick
Themen
Schulungskonfigurator
Konzepte
.NET/Visual Studio
C#
VB.NET
ASP.NET
TFS/ALM/Scrum
PowerShell
Konferenzvortraege
Referenzkunden
Trainerprofile
Konditionen
Anfrage
Offene Schulungen
Offene Schulungen
Überblick .NET-Seminare
.NET/C#-Basisseminar
WPF (Desktop)
ASP.NET/AJAX (Web)
WCF/WF (SOA)
ADO.NET/EF (Data)
Windows PowerShell
.NET
.NET
Startseite
Beratung/Training
Offene .NET-Seminare
Einführung
Lexikon
Artikel
Bücher
Klassenreferenz
Programmiersprachen
Entwicklerwerkzeuge
Softwarekomponenten
World Wide Wings Demo
Codebeispiele
Scripting
ASP.NET
.NET 2.0
.NET 3.0/3.5
.NET 4.0
Community
Forum
Kommerzielle Leistungen
ASP.NET
ASP.NET
Startseite
Lexikon
Sicherheit
Konfiguration
Global.asax
Tracing
Mehr zu ASP.NET 1.x
Mehr zu ASP.NET 2.0
Klassenreferenz
Programmiersprachen
Entwicklerwerkzeuge
Softwarekomponenten
PowerShell
PowerShell
Überblick
Beratung
In-House-Schulungen
Öffentliche Schulungen
Codebeispiele
Commandlet Extensions
Windows Scripting
Windows Scripting
Startseite
Lexikon
FAQ
Buecher
Architektur
Skriptsprachen
Scripting-Hosts
Scripting-Komponenten
COM/DCOM/COM+
ADSI
WMI
WMI-Klassenreferenz
Scripting-Tools
WSH-Editoren
Codebeispiele
ASP.NET
.NET-Scripting
Forum
Links
Kommerzielle Leistungen
Windows Server
Windows Server
Startseite
Lexikon
Forum
Service
Service
Website-FAQ
Anmeldung/Login
Leser-Registrierung
Gast-Registrierung
Nachrichten/RSS
Newsletter
Foren
Weblog Deutsch
Lexikon
Downloads
Support
Kontakt
Literaturtipps
Publikationen
Publikationen
Redaktionsbüro
Bücher
Fachartikel
Leser-Portal
Autoren gesucht!
Rezensionen
Über uns
Über uns
Holger Schwichtenberg
Team
Referenzkunden
Kundenaussagen
Referenzprojekte
Partner
Site Map
Tag Cloud
Impressum
Rechtliches
AGB

Weblogs-Einträge und Nachrichten unserer Experten

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

13.05.2012 15:58:24
PDF-zu-Text konvertieren: http://t.co/VDqwyUPV
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Im Release Candidate von Visual Studio 11 kehrt Farbe zurück

11.05.2012 08:15:04
Microsoft hat das farblose neue Design von Visual Studio 11 Beta revidiert.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

11.05.2012 07:29:16
Im Release Candidate von Visual Studio 11 kehrt Farbe zurück - Microsoft lenkt beim Design der IDE teilweise ein: http://t.co/nGxlTp6f
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

10.05.2012 21:53:44
Spricht mir aus der Seele: "@RWW: The App is Dead (OK Not Really, But The Browser Is Back) http://t.co/Zjs2Do0q";
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Folien und Beispiele zu Vortrag über Azure Servide Bus EAI & EDI bei .NET User Group Graz

10.05.2012 15:54:00

Nachfolgend die Unterlagen und Beispiele, die ich heute bei meinem Vortrag bei der .NET User Group in Graz verwenden werde. Zum Einrichten der Beispiele kann die Anleitung unter [1] verwendet werden.

Zum Nachvollziehen des erweiterten Beispiels mit dem LOB-Adapter und Lookup-Provider muss man:

  • Einen SQL-LOB-Adapter einrichten, der auf eine lokale Orders-Tabelle (ID int identity(1,1) primary key, PNR varchar(50), ONR varchar(50), cnt int) verweist, einrichten
  • Die Maps und den Verweis auf den LOB-Adapter in der Bridge-Konfiguration anpassen oder entsprechend neu gestalten
  • Die Konfiguration des Lookup-Providers auf eine SQL Azure DB mit einer entsprechenden Tabelle anpassen

Infos dazu findet man unter [2]. Dort findet man zwei Tutorials, welche die Arbeit mit dem Service-Bus veranschaulichen.

 

[1] http://www.softwarearchitekt.at/post/2012/04/29/Azure-Service-Bus-EAI-und-EDI-Folien-und-Beispiele-von-Basta-on-Tour-2012-in-Koln.aspx

[2] http://msdn.microsoft.com/en-us/library/windowsazure/hh689864

 

Azure Service Bus.pdf (1,38 mb)

Azure-Service-Bus-Sample.zip (2,69 mb)

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

10.05.2012 14:21:11
Folien und Beispiele zu Vortrag über Azure Servide Bus EAI & EDI bei .NET User Group Graz http://t.co/sV9uvwQB
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

09.05.2012 21:16:59
Azure Service Bus: Zwischen Labs-Umgebung und Echt-Umgebung wechseln: http://t.co/xmb8q1f5
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

09.05.2012 19:32:23
Das Ende der JSON-Serialusierungs-Probleme? "@scottgue:shipping http://t.co/7cPy6bwp with http://t.co/Np7VW3SO Web API starting with the RC"
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Als Windows Azure-Insider ausgezeichnet

06.05.2012 22:17:00

Microsoft hat mich letzte Woche für meine Community-Aktivitäten als Azure-Insider ausgezeichnet, was mich sehr freut. Das bedeutet unter anderem, dass ich nun einen direkten Draht zum Produkt-Team in Redmond habe und somit vorab mit wichtigen und vertraulichichen Informationen versorgt werde. Daneben kann ich mich mit Fragen direkt an die Leute vor Ort wenden.


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

06.05.2012 20:39:06
@stevensanderson Steve, can you aswer this question about the upshot.js OfflineProvider: http://t.co/yOmbLCO2
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

06.05.2012 20:20:09
Als Windows Azure-Insider ausgezeichnet http://t.co/avPwZLqM
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

04.05.2012 20:12:26
Folien und Beispiele für Vortrag "ADO.NET Entity Framework 5.0" auf #dnc12 http://t.co/nH20kitb
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Vortrag "ADO.NET Entity Framework 5.0"

04.05.2012 10:32:58
Die Folien und Beispiele zum Vortrag "ADO.NET Entity Framework 5.0 – Was ist neu seit 4.0?" stehen zum Download zur Verfügung.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Azure Service Bus EAI und EDI: Folien und Beispiele von Basta on Tour 2012 in Köln

29.04.2012 15:28:00

Nachfolgend meine Folien und mein Beispiel zum Vortrag "Azure Service Bus EAI und EDI", welchen ich diese Woche auf der BASTA! on Tour 2012 in Köln gehalten habe.

Um das Beispiel zum Laufen zu bekommen, muss man ...

  • Die aktuelle Azure Service Bus EAI und EDI CTP (am besten in einer Test-VM!!) installieren: http://www.microsoft.com/en-us/download/details.aspx?id=17691
  • Im Azure Labs-Portal einen Namespace anlegen: https://portal.appfabriclabs.com/Default.aspx
  • Im .NET-Framework-Verzeichnis (z. B. C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config) die beiliegende Datei ServiceBus.config positionieren, damit die Beispiele nicht auf den "echten" Service-Bus sondern auf die Labs-Umgebung zugreifen (es handelt sich dabei ja noch um eine CTP!)
  • In der Bridge-Konfiguration die Eigenschaft Namespace auf den zuvor eingerichteten Namespace anpassen
  • Im Projekt ESB die Endpunkt-Konfiguration von Client-A und Service-B anpassen, sodass sie auf die entsprechenden URL, welche u. a. den eingerichteten Namespace beinhalten, verweist.
    • Diese Adressen findet man in der Eigenschaft Runtime-Adress, die im Eigenschaften-Fenster zu finden ist, nachdem man in der Bridge-Konfiguration entweder OrderA oder OrderB angeklickt hat. Ersteres steht für die Cient-A und letzteres für den Service-B.

 

Azure ServiceBus.pdf (625,79 kb)

APRIL_2012_Orders_BOT.zip (2,61 mb)


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

WCF Security Szenarien - Folien und Beispiele von der BASTA! on Tour 2012 in Köln

29.04.2012 14:46:00

Nachfolgend findet man die Folien und Beispiele meiner Session zu WCF Security von der BASTA! on Tour. Die Beispiele beinhalten folgende Szenarien:

  • Windows Security
  • Windows Security via SSL
  • SSL mit benutzerdefinierter Benutzerprüfung (benutzerdefinierte AuthorisationPolicy und PasswordValidator)
  • SSL mit Clientzertifikaten
  • Nachrichtenbasierte Sicherheit mit teilweiser Verschlüsselung der SOAP-Nachrichten

Um die letzten beiden Beispiele zum Laufen zu kriegen, muss man vorher mit der mitgelieferten .bat-Datei die entsprechenden Zertifikate erstellen und diese anschließend im Certificate Store installieren. Am besten verwendet man dazu den als Administrator gestarteten Visual Studio Command Prompt. Den Certificate Store erreicht man über das Zertifikate-Snap-In der Management Console (mmc). Die generierten Dateien ca.cer und ca.crl sind unter "Vertrauenswürdige Stammzertifizierungsstellen" einzutragen; server.pfx und client.pfx unter eigene Zertifikate.

Da das Beispiel für Client-Zertifikate SSL ohne IIS verwendet, ist zusätzlich das server-Zertifikat an das gewünschte SSL-Port zu binden. Dies kann mit dem folgenden Kommandozielen-Befehl bewerkstelligt werden. 44400 ist dabei das gewünschte Port; unter certhash ist der Fingerabdruck des Zertifikates einzutragen und unter appid eine beliebige (eindeutige) GUID.

netsh http add sslcert ipport=0.0.0.0:44400 certhash=e31a0a8320d6f89ba5849a9c46d43c44dd2133ea appid={00112233-4455-6677-8899-AABBCCDDEEFF}

Das WIF-Beispiel befindet sich zwar nicht direkt in dieser Beispielsammlung, aber nachfolgend findet man eine Schritt-für-Schritt-Anweisung, mit der dieses Beispiel nachgestellt werden kann.

 

WCF_Security.pdf (585,09 kb)

WCF-Security-Szenarien.zip (965,39 kb)

Claims-Sample.pdf (647,27 kb)


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Einführung und Erfahrungsbericht zu Azure (Slides von der BASTA! on Tour)

29.04.2012 14:25:00

Nachfolgend platziere ich meine Folien zu meiner Session "Cloud Computing mit Windows Azure: Einführung und ein Erfahrungsbericht aus einem echten Cloud-Projekt", welche ich diese Woche auf der BASTA! on Tour in Köln gehalten habe. Darüber hinaus findet man nachfolgend auch mein Beispiel zu Azure Federations - der direkt in SQL Azure integrierten Sharding-Lösung.

 

steyer_Azure.pdf (1,83 mb)

steyer_Azure_Erfahrungsbericht.pdf (1,04 mb)

federations.sql.txt (2,37 kb)


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Beispiel: Mobile Web-Apps mit ASP.NET WebAPI, SignalR, jQuery Mobile und knockout.js (BOT)

29.04.2012 14:09:00

Diese Woche habe ich auf der BASTA! on Tour in Köln aus organisatorischen Gründen eine weitere Session zum Thema "Mobile Web-Apps mit ASP.NET WebAPI, SignalR, jQuery Mobile und knockout.js" kurzerhand eingeschoben. Das Ziel war es zu zeigen, wie man eine mobile, offline- und echtzeit-fähige Web-App mit einem Mix aus serverseitigen Code und Java-Script APIs bauen kann.

Für die mobile GUI kommt  dabei jQuery Mobile zum Einsatz; für die Kommunikation mit dem Server, die neue ASP.NET Web API. Echtzeit-fähigkeit wird mit Web Sockets bzw. dem neuen SignalR-Framework realisiert und für das Offline-Szenario werden der HMTL 5 Local Storage und das Cache-Manifest bemüht, wobei ersterer mittels amplify.js abstrahiert wird, damit auch ältere Browser, die ein zum Local Storage vergleichbares Konzept anbieten, adressiert werden können.

Die Sourcen dazu, welche zu geschätzten 80% aus einem realen Projekt stammen, findet man nachfolgend.

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

29.04.2012 14:06:53
Azure Service Bus EAI und EDI: Folien und Beispiele von Basta on Tour 2012 in Köln http://t.co/YA7XHcnA
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

29.04.2012 13:54:32
Einführung und Erfahrungsbericht zu Azure (Slides von der BASTA! on Tour): http://t.co/yqFCURsp
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

29.04.2012 13:36:05
WCF Security Szenarien - Folien und Beispiele von der BASTA! on Tour 2012 in Köln http://t.co/Zl3GeTRV
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

29.04.2012 12:34:34
Beispiel: Mobile Web-Apps mit http://t.co/Np7VW3SO WebAPI, SignalR, jQuery Mobile und knockout.js (BOT) http://t.co/CfRBc8yz
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Infotag zu .NET 4.5, Visual Studio 11 und Windows 8

23.04.2012 11:03:08
.NET 4.5, Visual Studio 11 und Windows 8 biegen auf die Zielgerade ein. Was das für Softwareentwickler bedeutet, will in Essen der Infotag am 20. Juni beleuchten.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

ASP.NET Web API: Message Handler für Cross-Cutting Concerns

23.04.2012 00:00:00
Querschnittsfunktionen, die für alle Services zur Ausführung gebracht werden sollen, können in Message Handler ausgelagert werden. Die nachfolgende Listing zeigt, wie man einen solchen Message-Handler durch Ableiten von DelegatingHandler implementieren kann.
public class LoggingHandler : DelegatingHandler 
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        Debug.WriteLine("Begin Request: {0} {1}", request.Method, request.RequestUri);
        return base.SendAsync(request, cancellationToken);
    }
}
Damit ASP.NET Web API den Handler verwendet, ist er wie folgt - am besten in der Global.asax - zu registrieren.
GlobalConfiguration.Configuration.MessageHandlers.Add(new LoggingHandler());

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

22.04.2012 22:19:18
http://t.co/Np7VW3SO Web API: Message Handler für Cross-Cutting Concerns http://t.co/gipFzLQA
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

18.04.2012 16:39:33
wow:"@martinfowler: bliki post: Test Coverage can be useful, but more often its misused as a target or sign of health http://t.co/51dnZp61";
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

18.04.2012 16:19:02
Interessant: "@heisedc: Sencha Architect 2: RAD-Tool für HTML5-Apps http://t.co/DPvvKmQ3";
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

18.04.2012 10:38:21
Wieviele Instanzen des http://t.co/yAd5L7h0 Entity Framework-Kontextes sollte man verwenden? Artikel @dotnetpro_mag 5/2012 S. 90 ff.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

17.04.2012 06:19:59
Von der Datenbank bis zur Oberfläche mit .NET, Teil 3: Eine Weboberfläche mit http://t.co/qghYcxMc - heise Developer http://t.co/X3t77u7F
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

17.04.2012 06:19:25
Wirklich kein gewohntes Startmenü in Windows 8 !? http://t.co/YbqxmJIq
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Wirklich kein gewohntes Startmenü in Windows 8 !?

16.04.2012 23:44:54
Microsoft scheint es ernst zu meinen, dass Windows 8 nicht mehr den gewohnten Startbutton mit Startmenü enthalten wird, obwohl es viel Kritik daran gibt und es doch eine Kleinigkeit wäre, diese Option zu erhalten.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

16.04.2012 20:08:28
Der Anwender auf der verzweifelten Suche nach dem Startmenü/Startbildschirm in Windows 8: http://t.co/wXyXTSWN!.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

16.04.2012 16:16:21
... und View-Generation auf Knopfdruck.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

16.04.2012 16:08:58
EF Power Tools Beta 2 Available: Generierte Code-Only-Templates mit T4 anpassen: http://t.co/NXXg05h5
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Conditional GET mit ASP.NET Web API

14.04.2012 15:22:00
Als Conditional GET wird ein durch das HTTP-Protokoll unterstützter Mechanismus bezeichnet, der es Clients erlaubt, Dokumente lediglich unter der Bedingung, dass sie sich seit dem letzten Aufruf geändert haben, anzufordern. Hat sich das Dokument nicht geändert, antwortet der Server mit dem Statuscode 304 (Not Modified). Ansonsten wird das geänderte Dokument zurückgeliefert.
 
Um entscheiden zu können, ob sich ein Dokument geändert hat, sendet der Server mit den einzelnen Antworten einen sogenannten Entity Tag (ETag). Dieser beinhaltet einen Wert, welcher die aktuelle Version repräsentiert. Dabei kann es sich zum Beispiel um eine Versionsnummer, einen Zeitstempel oder einen Hashwert handeln. Bei weiteren Anfragen, welche sich auf dasselbe Dokument beziehen, sendet der Client diesen Wert an den Server zurück. Durch einen Vergleich mit dem aktuellen ETag kann dieser somit entscheiden, ob der Client bereits die aktuelle Version hat oder ob sich das Dokument seit dem letzten Abrufen geändert hat.
  
Ein einfaches Beispiel für die Umsetzung dieses Konzepts mit ASP.NET Web API, der neuen "REST"-API aus dem Hause Microsoft, findet sich nachfolgend.
private string Quote(string str)
    {
        return "\"" + str + "\"";
    }
 
    public HttpResponseMessage<HotelBuchung> Get(int id/*, HttpRequestMessage request*/)
    {
        var request = this.Request; // HACK für BETA1
 
        var rep = new HotelBuchungRepository();
        var buchung = rep.FindById(id);
 
        if (buchung == null)
        {
            return new HttpResponseMessage<HotelBuchung>(HttpStatusCode.NotFound);
        }
 
        // ETags befinden sich per Definition 
        // in doppelten Anführungszeichen!!
        var etag = Quote(buchung.Version.ToString());

        var ifNoneMatchHeader = request.Headers.IfNoneMatch.FirstOrDefault();
        if (ifNoneMatchHeader != null && ifNoneMatchHeader.Tag == etag)
        {
            return new HttpResponseMessage<HotelBuchung>(HttpStatusCode.NotModified);
        }
 
        var response = new HttpResponseMessage<HotelBuchung>(buchung);
        response.StatusCode = HttpStatusCode.OK;
        response.Headers.CacheControl = new CacheControlHeaderValue();
        response.Headers.CacheControl.NoCache = true;
        response.Headers.ETag = new EntityTagHeaderValue(etag);
        return response;
 
    }

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

BASTA! on Tour in Düsseldorf: 25. bis 27. April 2012

14.04.2012 15:15:00

In zwei Wochen findet wieder die BASTA! on Tour in Düsseldorf statt. Der Schwerpunkt dabei ist wieder das Thema Architektur. Mit dabei sind Jörg Neumann, Dr. Holger Schwichtenberg, Christian Wenz, Christian Weyer und meine wenigkeit.

Ich hab wieder die Ehre, auf dieser Veranstaltung über WCF und Security mit WCF (u. a. mit WIF) zu sprechen. Daneben werden ich über Erfahrungen aus einem Azure-Projekt plaudern und die Möglichkeiten von Azure Service Bus, der künftig um EAI/ EDI-Möglichkeiten erweitert wird, erzählen.

Weitere Infos findet man unter http://basta-on-tour.de/


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

14.04.2012 13:49:55
BASTA! on Tour in Düsseldorf: 25. bis 27. April 2012 http://t.co/p8Ib0YMQ
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

14.04.2012 13:49:55
Conditional GET mit http://t.co/Np7VW3SO Web API http://t.co/IB7eJkaC
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Konferenz: ServTec Austria - Forum für innovative Dienstleistungen und neue Technologien: Kundenintegration,Simulation und Testen im Dienstleistungsentwicklungsprozess

13.04.2012 18:27:00

 

ServTec Austria - Forum für innovative Dienstleistungen und neue Technologien
Edition 2: Kundenintegration, Simulation und Testung im Dienstleistungsentwicklungsprozess

In „Edition 2“ geht es diesmal um die Klärung von zwei Fragestellungen aus der Wirtschaft: „Wie kann man Dienstleistungen vor der Markeinführung simulieren und testen?“ und „Wie kann man intelligente Dienstleistungen durch intelligente Kundenintegration (Smarte Services) entwickeln, die einen besonderen Mehrwert für den Kunden und das eigene Unternehmen bringen?“.

Dazu werden bekannte Verfahren aus der Produktentwicklung den neuen Ansätzen im Dienstleistungsentwicklungsumfeld (u.a. Fraunhofer IAO aus Stuttgart und Evolaris next level GmbH aus Graz mit dem Living Lab) gegenübergestellt. In Fallstudien wird aufgezeigt, wo Smarte Services bereits am Wirken sind und wie man diese entwickelt. Im Rahmen einer Podiumsdiskussion mit internationalen ExpertInnen werden schlussendlich die Potentiale der vorgestellten Ansätze beleuchtet und branchenübergreifende Zusammenhänge hergestellt.

Natürlich gibt es auch heuer wieder viele Möglichkeiten um in den Pausen und im Anschluss der Veranstaltung mit den Experten direkt zu diskutieren und es werden wieder Angebote vorgestellt, um Hilfestellung bei der Optimierung der eigenen Dienstleistungslandschaft im Unternehmen zu bekommen.

Weitere Informationen:

http://www.campus02.at/DE/Studieng%c3%a4nge/Informationstechnologien%20%20Wi5/News%20%20Events/Events/ServTec+2012.aspx

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

13.04.2012 16:41:27
Konferenz: ServTec Austria - Forum für innovative Dienstleistungen und neue Technologien: Kundenintegration,Simu... http://t.co/ptJVpbNK
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.04.2012 10:36:20
Eine kostengünstige Fortbildung am Wochenende bietet die "SQL Server und .NET-Konferenz" (SNEK) am 28.+29.4. Hannover. http://t.co/bnyLWxMF
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

SQL Server und .NET-Konferenz (SNEK) am 28.und 29. April

13.04.2012 08:08:47
Eine kostengünstige Fortbildung am Wochenende bietet die "SQL Server und .NET-Konferenz" am 28. und 29. April in Hannover.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

12.04.2012 12:19:19
Enumerationen/Aufzählungstypen im http://t.co/yAd5L7h0 Entity Framework 5.0 - heise Developer http://t.co/cvYVfeA5
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Enumerationen im ADO.NET Entity Framework 5.0

12.04.2012 10:51:05
Die Version 5.0 des ADO.NET Entity Framework unterstützt auch das Mapping von .NET-Enumerationen (Aufzählungstypen) auf Datenbankspalten.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

09.04.2012 22:15:01
Fan von Dojo Mobile: Web-Apps wirken "nativer" als jQuery Mobile Apps + mehr Features - Rendering scheint aber langsamer zu sein.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

07.04.2012 19:51:07
Spricht mir aus der Seele: "@AlexZeitler: developing (web) apps using #aspnetwebapi, html and #javascript feels so natural [...]"
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

05.04.2012 12:53:26
Last-Minute-Plätze bei der BASTA-on-Tour mit 20% Rabatt - 25. bis 27. April 2012 in Köln - Rabattcode: basta2088. http://t.co/o3Q66oq3
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Last-Minute-Plätze bei der BASTA-on-Tour mit 20 Prozent Rabatt

05.04.2012 10:45:08
Für die "BASTA! on Tour – Architecture & Good Practices" am 25. bis 27. April 2012 räumt der Veranstalter einen Sonderrabatt von 20 Prozent für Kurzentschlossene ein.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

05.04.2012 06:32:37
http://t.co/yAd5L7h0 Entity Framework 5.0 Beta 2 erschienen: keine wesentlichen neuen Features, aber Bugfixes: http://t.co/ZWYcFmCz
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Self-Tracking-Entities mit NHibernate

04.04.2012 21:51:00
Eine Herausforderung beim Arbeiten mit abgehängten Objekten ist es, nach dem Wiederanhängen herauszufinden, welche Datensätze eines Objektgraphen sich geändert haben. Zur Lösung dieser Herausforderung habe ich eine Implementierung der aus Entity Framework bekannten Self-Tracking-Entities umgesetzt.
Dabei stellt der Enum EntityState den aktuellen Zustand einer Entität dar. Das Interface IEntity, welche lediglich eine Eigenschaft State von diesem Typ vorgibt, ist von allen Self-Tracking-Entities zu implementieren. Alternativ dazu kann man auch von der Klasse Entity, welche zusätzlich ein paar Convenience-Methoden zum Ändern und Abfragen der Eigenschaft State bietet, abgeleitet werden.
public enum EntityState
{
    Unmodified = 0,
    Modified = 1,
    Deleted = 2
}

public interface IEntity
{
    EntityState State { get; set; }
}

public abstract class Entity : IEntity, ILifecycle
{
    public virtual EntityState State { get; set; }

    public  virtual void MarkAsDeleted()
    {
        State = EntityState.Deleted;
    }

    public virtual void MarkAsModified()
    {
        State = EntityState.Modified;
    }

    public virtual void MarkAsUnModified()
    {
        State = EntityState.Unmodified;
    }

    public virtual LifecycleVeto OnDelete(NHibernate.ISession s)
    {
        return LifecycleVeto.NoVeto;
    }

    public virtual void OnLoad(NHibernate.ISession s, object id)
    {
        State = EntityState.Unmodified;
    }

    public virtual LifecycleVeto OnSave(NHibernate.ISession s)
    {
        return LifecycleVeto.NoVeto;
    }

    public virtual LifecycleVeto OnUpdate(NHibernate.ISession s)
    {
        return LifecycleVeto.NoVeto;
    }


}
Self-Tracking-Entities sollten darüber hinaus sicherstellen, dass jeder Setter die Eigenschaft State auf Modified setzt. Hierfür bietet sich der Einsatz von Code-Generatoren an. Kann man das nicht sicherstellen, muss man diese Eigenschaft nach jeder Änderung manuell setzen, zum Beispiel im View-Model.
[Class(Name = "NHibernateSample.entities.Bestellung, NHibernateSample")]
public class Bestellung : Entity
{
    public Bestellung()
    {
        Positionen = new Iesi.Collections.Generic.HashedSet<Position>();
    }

    protected int bestellungId;


    protected DateTime bestellDatum { get; set; }

    [Id(0, Name = "BestellungId")]
    [Generator(1, Class = "hilo")]
    public virtual int BestellungId
    {
        get { return bestellungId; }
        set
        {
            bestellungId = value;
            this.MarkAsModified();
        }
    }

    [Property(0, Name = "BestellDatum")]
    public virtual DateTime BestellDatum
    {
        get { return bestellDatum; }
        set
        {
            bestellDatum = value;
            this.MarkAsModified();
        }
    }


    [Set(0, Name = "Positionen", Lazy = CollectionLazy.True,
        Cascade = "NONE", Inverse = true)]
    [Key(1, Column = "BestellungId")]
    [OneToMany(2,
        Class = "NHibernateSample.entities.Position,NHibernateSample")]
    public virtual IesiCollections.ISet<Position> Positionen { get; set; }

    public virtual void AddPosition(Position p)
    {
        Positionen.Add(p);
        p.Bestellung = this;
        this.MarkAsModified();
        // p.State = EntityState.Modified;
    }

}


    [Class(Name = "NHibernateSample.entities.Position, NHibernateSample")]
    public class Position : Entity
    {

        [Id(0, Name = "PositionId")]
        [Generator(1, Class = "native")]
        protected virtual int? PositionId { get; set; }


        protected int anzahl;

        [Property(0, Name = "Anzahl")]
        public virtual int Anzahl
        {
            get { return anzahl; }
            set
            {
                anzahl = value;
                this.MarkAsModified();
            }
        }


        private String pizza;

        [Property(0, Name = "Pizza")]
        public virtual String Pizza
        {
            get { return pizza; }
            set
            {
                pizza = value;
                this.MarkAsModified();
            }
        }


        private Bestellung bestellung;

        [ManyToOne(0, Name = "Bestellung", Column = "BestellungId")]
        public virtual Bestellung Bestellung
        {
            get { return bestellung; }
            set
            {
                bestellung = value;
                this.MarkAsModified();
            }
        }


    }
Für das Speichern des Objektgraphs wurden einige Erweiterungsmethoden für die Klasse Session eingerichtet. Attach führt je nach Status ein SaveOrUpdate oder ein Delete aus. AcceptChanges führt sämtliche Zustandsaufzeichnungen des übergebenen Sets wieder zurück. Dies ist nach dem Speichern von Objekte erforderlich. Somit wird u. a. verhindert, dass NHibernate versucht, eine zum Speichern oder Löschen markierte Entität erneut zu speichern bzw. zu löschen. AttachAll hängt ruft für alle Entitäten eines Sets Attach auf.
public static class SessionExtensions {
        public static void Attach(this ISession session, IEntity obj) {
           
            if (obj.State == EntityState.Modified)
            {
                session.SaveOrUpdate(obj);
            }
            else if (obj.State == EntityState.Deleted)
            {
                session.Delete(obj);
            }
        }

        public static void AcceptChanges<T>(this Iesi.Collections.Generic.ISet<T> set)
        {
            foreach (IEntity entity in set)
            {
                entity.State = EntityState.Unmodified;
            }
            
        }


        public static void AttachAll<T>(this ISession session, Iesi.Collections.Generic.ISet<T> set)
        {

            foreach (IEntity entity in set)
            {
                Attach(session, entity);
            }
        }   
    }
Das nachfolgende Listing zeigt, wie diese Erweiterungsmethoden einzusetzen sind. In der gezeigten Methode wird zunächst für die übergebene abgehängte Bestellung SaveOrUpdate aufgerufen; anschließend werden die Zustände der geänderten Bestellungen mit AttachAll an die Session übergeben. Am Ende werden mit MarkAsUnModified bzw. AcceptChanges die Zustände auf Unmodified zurückgesetzt.
class BestellungDAO
{

    […]

    /// <summary>
    /// Speichert Bestellung inkl. Positionen
    /// </summary>
    /// <param name="b"></param>
    public void Save(Bestellung b)
    {
        using (ISession session = HibernateHelper.SessionFactory.OpenSession())
        {
            using (ITransaction trans = session.BeginTransaction())
            {
                session.SaveOrUpdate(b); // Keine Cascade !!
                session.AttachAll(b.Positionen);

                trans.Commit();

                b.MarkAsUnModified();
                b.Positionen.AcceptChanges();
            }
        }
    }
}
Wird nun die nachfolgend gezeigte Methode ausgeführt, bleiben am Ende die Positionen 1 und 3 übrig, wobei bei Position 3 die Anzahl auf 4 erhöht wurde. Das schöne dabei ist, dass lediglich die geänderten Positionen vom zweiten Aufruf von Save an die Session übergeben wird.
public static void SaveBestellung()
{
    BestellungDAO dao;
    dao = new BestellungDAO();

    Bestellung b = new Bestellung
    {
        BestellDatum = DateTime.Now,
    };

    Position p1 = new Position { Anzahl = 2, Pizza = "Test 1"};
    b.AddPosition(p1);

    Position p2 = new Position { Anzahl = 2, Pizza = "Test 2"};
    b.AddPosition(p2);

    Position p3 = new Position { Anzahl = 2, Pizza = "Test 3" };
    b.AddPosition(p3);

    dao.Save(b);

    p2.Anzahl = 4;
    p3.State = EntityState.Deleted;

    dao.Save(b);

}
Weitere Möglichkeiten:
  • Durch die Verwendung von Reflection und einer Tiefen- oder Breitensuche könnten alle geänderten Entitäten eines Objektgraphen mit nur einem Methodenaufruf an die Session übergeben werden.
  • Diese Implementierung  funktioniert lediglich für ISet aus den IesiCollections. Man sollte hier über eine allgemeine Implementierung nachdenken.

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

04.04.2012 20:07:21
Self-Tracking-Entities mit NHibernate http://t.co/zcC5CPog
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

02.04.2012 18:41:23
Microsoft Script Explorer for Windows PowerShell: Skripte im Internet und auf der lokalen Platte/im lokalen Netz suchen http://t.co/0vYahtbg
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

02.04.2012 05:48:02
@chwenz Gratulation
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

02.04.2012 04:02:21
Klingt vielversprechend, Wrapper für REST API, erst v0.1 "@scottgu: [...]Fluent API library for managing Azure[...]: http://t.co/CUEyRzSz";
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

ADO.NET Entity Framework 5.0 Beta 2

01.04.2012 12:26:41
Weniger als einen Monat nach der ersten Beta-Version von ADO.NET Entity Framework 5.0 steht nun schon Beta 2 zur Verfügung.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

IT-Visions-Infotag zu .NET 4.5 und Windows 8

31.03.2012 20:12:00

.NET 4.5, Visual Studio 11 und Windows 8 biegen auf die Zielgerade ein. Was bedeutet das für Softwareentwickler? Was ist Hype? Was braucht man? Welche Techniken sind jetzt "tot"?

Wir laden Sie herzlich ein zu unserem Infotag am Mi, 20.06.2012 (Fußballfans: an dem Tag ist kein EM-Spiel!)

9:30 bis 19:00 Uhr in Essen.

Referenten: FH-Prof. Manfred Steyer, Dr. Joachim Fuchs und Dr. Holger Schwichtenberg

Inhalte: C# 5.0, Visual Basic 11, ADO.NET 4.5 und ADO.NET Entity Framework 5.0, ASP.NET 4.5, ASP.NET MVC, ASP.NET Web API, WCF 4.5, WPF 4.5, App-Programmierung mit Windows 8, Migration auf Azure und Visual Studio 11

Genaue Agenda: http://www.IT-Visions.de/[QBMS]/go.aspx?N21INT

Erfahren Sie jetzt schon, was mit .NET 4.5, Visual Studio 11 und Windows 8 auf Sie als .NET-Softwareentwickler zukommt. Dieser Infotag liefert Ihnen einen prägnanten Überblick über die kommenden Entwicklerprodukte von Microsoft. Sie erhalten eine geballte Informationsladung und eine objektive, neutrale Bewertung - ohne Marketing-Aussagen von Microsoft. Vortragende an diesem Tag sind drei Top-Experten der .NET-Entwicklungsszene, die Sie von Vorträgen, Fachartikeln und Fachbüchern schon kennen:

149€ zzgl. 19% MwSt (Frühbucherpreis bis 30.04.2012) danach 199€ zzgl. 19% MwSt

Wir freuen uns auf Ihre Anmeldung per Website oder Faxformular.

Anmeldung: http://www.IT-Visions.de/[QBMS]/go.aspx?N21INT

Möchten Sie diesen Infotag lieber als In-House-Veranstaltung für beliebig viele Teilnehmer zum Festpreis buchen?

Senden Sie uns eine Anfrage über dieses Formular: http://www.IT-Visions.de/[QBMS]/go.aspx?N21INT


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

31.03.2012 18:44:45
IT-Visions-Infotag zu .NET 4.5 und Windows 8 http://t.co/1skPYMMk
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

27.03.2012 08:03:20
@asp_net Bin mit Brother sehr zufrieden: Super Preis/Leistungsverh. + keine Probleme... Grund für die Entscheidung waren Amazon-Bewertungen
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

SignalR: Security-Szenarien mit aktueller Version

26.03.2012 23:16:00
Ich habe die letzten Tage überprüft, wie man mit der aktuellen Version von SignalR [1] (0.4-85) Security-Szenarien implementieren kann. Dabei habe ich die folgenden Möglichkeiten erfolgreich implementiert.

Hosting in ASP.NET + Zugriff über JavaScript aus derselben Site heraus
In diesem Szenario kann man Forms-based Security verwenden. Bei jedem Zugriff auf die in derselben Web-Site gehostete SignalR-Instanz wird das ausgestellte Security-Token als Cookie übertragen. Deswegen muss lediglich innerhalb der einzelnen Methoden der aktuelle Principal (System.Threading.Thred.CurrentPrincipal) geprüft werden. Diese Logik kann, wie weiter unten beschrieben, auch in der globalen Methode Application_AuthenticateRequest (global.asax) erfolgen.

Hosting in ASP.NET + Zugriff über C#-Client
In diesem Fall kann man sich entweder die in IIS implementierte HTTP Authentifizierung verlassen, oder eine benutzerdefinierte Art der Authentifizierung implementieren. Ersteres ist zwar einfach, veranlasst jedoch immer eine Prüfung gegen Active Directory-Benutzer. Mit benutzerdefinierten IIS-Modulen kann dieses Verhalten zwar angepasst werden, allerdings werden sich die meisten Admins weigern, benutzerdefinierte IIS-Module einzusetzen.
Bei der benutzerdefinierten Art der Authentifizierung ist zu beachten, dass es die aktuelle Version des C#-Clients nur bedingt erlaubt, Daten via HTTP zu übersenden. Angeboten wird die Übertragung von Credentials als Header sowie die Übertragung von Cookies. Benutzerdefinierte Header können derzeit leider noch nicht übertragen werden. Dies macht die Implementierung erweiterter Security-Szenarien, bspw. mittels OAuth, nicht möglich.
Das nachfolgende Listing zeigt, wie man HTTP BASIC auf diese Weise manuell implementieren kann. Somit kann gegen Benutzerpools jenseits von AD geprüft werden.
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
    var path = this.Request.Path.ToLower();
    if ( (path.StartsWith("/signalr/") || path.StartsWith("/raw/")) && !path.StartsWith("/signalr/hubs") ) OnAuthorization(this.Context);
}

public void OnAuthorization(HttpContext context)        
{            
    var request = context.Request;            
    var response = context.Response;             
    var header = request.Headers["Authorization"];             
            
    // Optimierungsmöglichkeit: Gegen Session-Cookie prüfen 

    if (string.IsNullOrEmpty(header) || !header.Trim().ToLower().StartsWith("basic")) {                
        response.Headers["WWW-Authenticate"] = "Basic";                
        response.StatusCode = 401; //Unauthorized
        return;            
    }             
    header = header.Trim();            
    header = header.Substring(5); // Basic wegschneiden ...            
    header = header.Trim();            
    header = Encoding.UTF8.GetString(Convert.FromBase64String(header));             
    var index = header.IndexOf(:);            
    if (index == -1)            
    {                
        response.Headers["WWW-Authenticate"] = "Basic";
        response.StatusCode = 401; //Unauthorized
        response.End();
        return;             
    }             
    var user = header.Substring(0, index);            
    var password = header.Substring(index + 1);
    if ((user != "Max" || password != "P@ssw0rd") && (user != "Susi" || password != "P@ssw0rd"))
    {                
        response.Headers["WWW-Authenticate"] = "Basic";
        response.StatusCode = 401; //Forbidden
        response.End();
    }

    // Optimierungsmöglichkeit: Session-Cookie ausstellen

            
    // Principal setzen
    var principal = new GenericPrincipal(new GenericIdentity(user), new string[] { });
    System.Threading.Thread.CurrentPrincipal = principal;
    context.User = principal;

}         

private static string RemovePrefix(string str, string prefix)        {            
    if (str.StartsWith(prefix))            {                
        str = str.Substring(prefix.Length, str.Length - prefix.Length);            
    }            
    return str;        
}
Das nachfolgende Listing zeigt den dazugehörigen Code, welcher den C#-Client verwendet. Es handelt sich dabei um eine für diesen Zweck erweiterte Version eines der mit SignalR mitgelieferten Beispiele.
var hubConnection = new HubConnection("http://localhost:40476/");

hubConnection.Credentials = new NetworkCredential("Max", "P@ssw0rd");
var demo = hubConnection.CreateProxy("SignalR.Samples.Hubs.DemoHub.DemoHub");

demo.On("invoke", i =>
{
    Console.WriteLine("{0} client state index -> {1}", i, demo["index"]);
});

            
hubConnection.Start().Wait();


demo.Invoke("multipleCalls").ContinueWith(task => {
        Console.WriteLine(task.Exception);
}, TaskContinuationOptions.OnlyOnFaulted);
 
Self-Hosting + Zugriff über C#-Client
In Self-Hosting-Szenarien kann die Callback-Methode OnProcessRequest zur Prüfung verwendet werden.
string url = "http://localhost:8081/";
var server = new Server(url);

server.MapHubs("/signalr");
            
server.OnProcessRequest = (ctx) =>
{
    Console.WriteLine("OnProcessRequest");
    if (ctx.Request.Cookies["Password"].Value != "P@ssw0rd") 
                                       throw new SecurityException();
};
server.Start();

Console.WriteLine("Server running on {0}", url);

Console.ReadKey();

In diesem Fall wird das Passwort als Cookie übergeben. Das ist notwendig, weil der C#-Client in der aktuellen Version noch keine ausgehenden Header unterstützt. Eine Betrachtung des Quellcodes von SignalR legt jedoch nahe, dass dies einfach zu implementieren ist, weswegen davon auszugehen ist, dass künftige Versionen von SignalR das Übersenden von Headern unterstützen werden.
Die Implementierung des Clients entspricht dabei der oben gezeigten, wobei das Passwort in diesem Fall als Cookie zu übergeben ist. Dabei ist darauf zu achten, dass als Domain-Name (hier localhost) jener, unter dem der Service läuft, übergeben wird. Ansonsten wird das Cookie nicht übertragen.
hubConnection.CookieContainer = new CookieContainer();
hubConnection.CookieContainer.Add(new Cookie("Password", "P@ssw0rd", "", "localhost"));

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

26.03.2012 21:39:32
SignalR: Security-Szenarien mit aktueller Version http://t.co/k2Pgrk9k
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

26.03.2012 18:37:56
.NET-LINQ-Zugriff auf Microsoft Access-Datenbanken mit C# und Visual Basic .NET - heise Developer http://t.co/Mydy77ib
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

.NET-LINQ und Microsofts Access-Datenbanken

26.03.2012 14:15:07
Wie man mit Language Integrated Query (LINQ) in C# oder Visual Basic .NET auf Microsofts Access-Datenbanken zugreifen kann.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

ADO.NET Entity Framework 5.0 Beta 1

14.03.2012 09:56:58
Microsoft setzt die schnelle Versionsfolge des hauseigenen objektrelationalen Mappers fort.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

14.03.2012 09:32:48
http://t.co/yAd5L7h0 Entity Framework 5.0 Beta 1: Neuheiten im Designer und beim Mapping. heise Developer http://t.co/mtQ3Ybfo
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

12.03.2012 17:22:02
Am FraPort scheint heute Karnevall zu sein. Also ich finds lustig ;-)
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

12.03.2012 08:21:51
Datenzugriffskolumne in @dotnetpro_mag 4/2012 "Daten-Power in der Shell: http://t.co/yAd5L7h0 & Entity Framework in der PowerShell", S.90ff.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

10.03.2012 09:33:32
Kolumne .NETversum in @win_developer 4/2012: Extensionmethod String.Truncate(), WCF-Collectiontypen im Proxy, Ko- und Kontravarianz in C#
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

09.03.2012 18:50:32
"Lizenz zum Kacheln" Ein erster Entwicklerblick auf die Windows 8 Consumer Preview. Mein Beitrag bei heise Developer: http://t.co/iILjqmHP
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

09.03.2012 15:41:46
"@DOTNETDOKTOR: Folien und Beispiele der Vorträge von Manfred Steyer, Joachim Fuchs und mir" @BASTAcon http://t.co/pVuJTdSo
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

09.03.2012 13:01:33
Folien und Beispiele der Vorträge von Manfred Steyer, Joachim Fuchs und mir auf der BASTA Spring 2012 in Darmstadt http://t.co/cm4jbl9U
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Folien und Beispiele unserer Vorträge auf der BASTA in Darmstadt

09.03.2012 11:26:54
Für die Teilnehmer und weitere Interessierte stehen die Folien und Programmcodebeispiele der Vorträge auf der Frühjahrs-BASTA zum Download zur Verfügung.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Jetzt schon Produktionseinsatz für .NET 4.5 und Visual Studio 11 Beta?

05.03.2012 09:45:03
Einerseits rühtmt sich Microsoft, dass die Qualität so gut sei, dass man die Beta in Produktionsumgebungen einsetzen dürfe und solle, andererseits warnt Microsoft auch wieder in fetter Schrift davor.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

05.03.2012 09:35:39
Von der Datenbank bis zur Oberfläche mit .NET, Teil 2: Application Server und Webservices (Heise Developer Tutorial) http://t.co/MqmLi33Q
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

05.03.2012 09:31:27
Jetzt schon Produktionseinsatz für .NET 4.5 und Visual Studio 11 Beta? - Leider gibt es da Widersprüche bei Microsoft: http://t.co/Y5sKDRzK
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

02.03.2012 15:02:11
Großer Andrang bei unserem End-2-End-Workshop auf der @bastacon: Wir mussten in einen größeren Raum wechseln. Wow!
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Code Only Beispiel @bastacon

01.03.2012 18:07:00

Nachfolgend mein Code Only-Beispiel, welches ich heute Vormittag auf der BASTA! Spring präsentiert habe.

src.zip (1,70 mb)

 

Weitere Links:

 

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

01.03.2012 17:40:59
Code Only Beispiel @bastacon http://t.co/m3U0CXTm
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Entity Framework Code Only Cheat Sheet @bastacon

01.03.2012 09:41:00

Nachfolgend der Link zu unserem Code Only Cheat Sheet.

http://www.it-visions.de/produkte/seminar.aspx?v=6298


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Warum relationale Datenbanken in der Cloud an ihre Grenzen stossen @bastacon

01.03.2012 09:38:00

Nachfolgend die Unterlagen meiner Session zu NoSQL, BASE und Sharding am Beispiel von Azure Storage Services und SQL Azure Federations auf der BASTA! Spring 2012.

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

01.03.2012 08:43:45
Warum relationale Datenbanken in der Cloud an ihre Grenzen stossen @bastacon http://t.co/igZHhds0
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

dot.net Magazin heißt jetzt windows.developer

29.02.2012 18:51:10
Das Entwicklermagazin aus dem Software & Support Verlag gibt sich einen neuen Namen in Anlehnung an Microsoft stärkere Betonung der Marke Windows.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

29.02.2012 18:03:32
Hintergründe zur Umbenennung von http://t.co/gPPli9Ns Magazin in windows.developer: http://t.co/CpdUMPyC - Interview mit dem Chefredakteur
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

29.02.2012 18:03:06
Das http://t.co/gPPli9Ns Magazin heißt jetzt "windows.developer". Bekanntmachung auf der #BASTACon 29.2.2012 19:03 Uhr. http://t.co/gCACjabK
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

29.02.2012 16:13:32
Die Visual Studio 11 Beta 1 ist da: http://t.co/58DeiAjn. Ebenso: TFS, TFS Express, VS Express für Web, VS Express für Windows
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

29.02.2012 13:50:51
Alex Egger und Christian Krenn auf @BASTAcon über Erfahrungen beim Einführen agiler Methoden.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

29.02.2012 11:34:27
Virtuelle Experten-Teams + Requirements-Komitee von Peter Rey erinnert an Crystal Orange von A. Cockburn (~1990er) - find ich gut @bastacon
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

29.02.2012 11:25:37
Peter Rey @bastacon über agiles Management: Mitarbeiter mit T-Profil benötigt (Generalisten mit Spezialisierung)
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

29.02.2012 11:23:23
Peter Ray @BASTAcon über agiles Management: Virtuelle Teams und Strukturen, die informelle Kommunikation fördern.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

29.02.2012 11:21:53
Peter Ray spricht auf @bastacon jetzt über agiles Management: Manager müssen Dienstleister für Entwicklungsteams sein.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

29.02.2012 07:55:00
Frank Düsterbeck jetzt auf @BASTAcon über den agilen Projektstart.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

28.02.2012 17:17:28
#bastacon. Oliver Sturm über C#: "Ich verwende meist einfach var. Ich bin ein fauler Typ"... "den Typ soll der Compiler kennen, nicht ich"
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

28.02.2012 16:34:13
@oocx Ja, SL/WPF-&gt;WinRT ist weniger Aufwand als VB6-&gt;VBNET. Aber Migrationsaufwand ist m.E. ohne Not größer als er sein sollte und könnte!
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

28.02.2012 16:28:20
#bastacon: Daniel Fisher über komplett JavaScript-basierte Webs:"1000 Zeilen Code für eine einzelne Funktionalität sind da schon mal drin".
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

28.02.2012 15:44:16
#bastacon: Folien und Beispiele zu meinem Vortrag "Neuheiten in http://t.co/qghYcxMc Webforms 4.5": http://t.co/tKe1LICX
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

28.02.2012 14:12:46
Informative Session vom @dotnetdoktor über http://t.co/Np7VW3SO 4.5 auf der @bastacon: Modelbinding, HTML 5, Tooling, WebSockets etc.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

28.02.2012 09:42:15
Tolle Session von Thomas C. Huber zu Win8-Apps. auf @bastacon: Überschneidung Silverlight und WinRT sehr groß; XAML prinzipiell wie gewohnt.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

28.02.2012 08:47:18
Keynote der #BASTACon: Jörg Neumann:"völlig egal, dass Silverlight tod ist. Es ist XAML!". Finde ich nicht egal. Jede Migration kostet Geld!
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Visual Studio LightSwitch: Nächste Version kostenfrei in Visual Studio

24.02.2012 14:38:40
Am Rande der gestrigen Vorstellung von Visual Studio 11 Beta gab es auch Neuigkeiten zu Microsofts RAD-Umgebung Visual Studio LightSwitch.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

24.02.2012 14:29:35
Visual Studio LightSwitch Version 2: Nächste Version des RAD-Tools kostenfrei in Visual Studio 11 und wohl mit HTML 5 http://t.co/N8DcjtQa
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

24.02.2012 08:51:56
Meine Heise.de-Nachricht mit Hintergrundinfos zu TFS Express und Visual Studio 11 Beta 1: http://t.co/sNy7F1UP #vs11Beta
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

23.02.2012 19:08:11
#vs11Beta:Neue "grau-in-grau"-Optik. Wie bei Expression Blend. Hellgrau oder dunkelgrau. Einzelne Farbakzente in blau. Neue farblose Icons.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

23.02.2012 18:08:12
Weitere Screenshots und Informationen zum neuen Design von Visual Studio 11 #vs11Beta: http://t.co/LIanGPYt
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

23.02.2012 18:01:16
Microsoft über VS11 Beta 1: "At beta LightSwitch doesnt support HTML5 output" Damit gibt Microsoft dann wohl zu, dass dies in Arbeit ist!
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

23.02.2012 17:55:43
Visual Studio 11 Professional oder höher wird Visual Studio LightSwitch umfassen. Es ist keine getrennte Lizenz mehr!
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

23.02.2012 17:34:51
Visual Studio 11 Beta 1: So sieht der neue Startscreen aus. http://t.co/q3t4GOxP
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

23.02.2012 17:29:35
Visual Studio 11 Beta 1: Neues Look & Feel http://t.co/ZWz8j2BE
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

23.02.2012 17:21:46
Neu: Visual Studio Express-Produkte werden TFS-Integration haben. Sowohl TFS Express als auch der vollständige TFS sind möglich!
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

23.02.2012 17:17:06
Details zum kostenlosen Team Foundation Server Express: http://t.co/ItjzQDYU
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

23.02.2012 17:15:58
NEU von Microsoft: Team Foundation Server Express: für bis zu 5 Entwickler. kostenfrei! Beta auch ab 29.2.2012!
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

23.02.2012 17:14:54
Visual Studio 11 Beta 1 und .NET 4.5 Beta 1 werden am 29.2.2012 verfügbar sein. Mit "Go live"-Lizenz!
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

23.02.2012 17:13:09
Soma (http://t.co/yBh0aaD5 ) erzählt gerade von Visual Studio 11 Beta 1. Sie soll "feature complete" sein. "Hunderte neue Funktionen" haben.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

22.02.2012 09:08:17
@dotnet_de hat im Vorfeld der @BASTAcon mit mir ein kurzes Interview geführt über den Datenzugriffstag am 1.3.2012 http://t.co/Flrku4KV
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Microsoft senkt Preise für SQL Azure

21.02.2012 09:21:07
Seit Mitte Februar bietet Microsoft ein neues Preismodell für die Cloud-Datenbank SQL Azure.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

21.02.2012 08:36:42
Microsoft senkt Preise für SQL Azure: http://t.co/8IFGKC4D
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

18.02.2012 18:43:16
Das Beispiel einer kompletten .NET-Anwendung von der DB bis zur Oberfläche: auch im @BASTACON-Workshop am 2. März http://t.co/OLnThVsg
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

.NET-Techniken im Zusammenspiel

18.02.2012 15:14:49
Sowohl im Tutorial auf heise Developer als auch in einem Workshop am 2. März wird das Entstehen einer kompletten .NET-Anwendung von der Datenbank bis zur Web- und Desktop-Oberfläche präsentiert.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

15.02.2012 14:21:33
BASTA on Tour: 25.-27.4.: .NET-Architekturen: EF, http://t.co/qghYcxMc, WPF, WCF, jQuery, SL, .NET 4.5, Mobile, Azure http://t.co/Ya5JOL8P
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

13.02.2012 17:28:12
Win8 wird VB6 unterstützen. Das unterstreicht einmal mehr: Investments are Safe. @DOTNETDOKTOR: http://t.co/zgUxaP9e
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.02.2012 16:35:09
Microsoft unterstützt Visual Basic 6 (VB6)-Anwendungen auch auf Windows 8: http://t.co/R8T9aGnL
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Microsoft unterstützt VB6-Anwendungen auch auf Windows 8

13.02.2012 14:16:36
Mirosoft hat erklärt, dass man Visual Basic 6.0 unter Windows 8 genauso gut unterstützen wird wie unter Windows 7.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

11.02.2012 17:12:58
EF 4.3 ist da und bringt MIGRATIONS für Code Only zum Aktualisieren von DB-Schemas: http://t.co/9YA5PGlc
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

09.02.2012 09:15:19
Mein Beitrag "Visual Studio LightSwitch in der Praxis" im @ixmagazin 2/2012: Schulungsverwaltung programmiert mit Word-Integration S. 138ff.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

03.02.2012 19:52:24
WCF: Bandbreite sparen mit EmitDefaultValue=false http://t.co/utPfR7G3
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

27.01.2012 15:14:19
.NET-Konferenztermine im Jahr 2012 - Veranstaltungstermine für .NET-Architekten & .NET-Entwickler im Überblick: http://t.co/5NpADh5R
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

27.01.2012 15:12:26
@goloroden Nein. Ich hatte einen Link zur #DDC12 angegeben. Die Texte durchlaufen dann aber Bearbeitungsschritte von anderen.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

27.01.2012 07:48:46
Von der Datenbank bis zur Oberfläche mit .NET, Teil 1: Datenzugriff und Logik. Ein durchgängiges Beispiel als Tutorial. http://t.co/xD9NTO2o
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

.NET-Konferenztermine 2012

26.01.2012 09:08:37
Ein Überblick über die kommenden .NET-Konferenzen in Deutschland im Jahr 2012.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Meine Folien zu Azure "AppFabric" vom Architekturforum Microsoft Österreich im Jänner 2012

10.01.2012 14:09:00

Nachfolgend findet man die Folien von meinem Vortrag über Azure "AppFabric", den ich in zwei Stunden beim Architekturforum von MS Österreich halten werde. Mein Beispiel zu "AppFabric" Integration (AppFabric Dec. 2011 CTP) findet man unter [1].

 

AppFabric.pdf (611,22 kb)

 

[1] http://www.softwarearchitekt.at/post/2012/01/08/Azure-(AppFabric)-EAIEDI-December-2011-CTP-Sample-sending-SOAP-and-SWT-Token-to-XML-Bridge.aspx

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

10.01.2012 13:31:41
Meine Folien zu Azure "AppFabric" vom Architekturforum Microsoft Österreich im Jänner 2012 http://t.co/yj5vacga
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Azure (AppFabric) EAI/EDI December 2011 CTP: Sample sending SOAP and SWT-Token to XML-Bridge

08.01.2012 04:44:00

Below, you find a sample for the Azure (AppFabric) EAI/EDI December 2011 CTP with a client (Client A) that sends a SOAP-message to an XML-Bridge. The bridge transforms the message and sends it to the destination service (OrderServiceB). This service is located on-premise and connected to the cloud by the usage of a relay-binding.

To send a SOAP-message to the bridge, the client has to request a SWT-Token from Azure (AppFabric) Access Control. For that, it uses the helper-classes AccessControllClient and WrapUtil located in the directory tools. After retrieving it, it includes the token in the actual message within a HTTP-header. Furthermore, the client has to send this message using SSL (Transport-Security without credentials).

After the transformation of the request, the bridge has to change to SOAP-Action-header for the receiving service within a route action; after the receipt and transformation of the response, the SOAP-Action-header now containing the action associated with the response is changed one more time for the receiver using a send action.

The file EAI_Order_Sample.zip contains the EAI-Project; EAI_ServicesAndClients_without_Key.zip consists of the Client (ClientA) and Service (OrderServiceB). Furthermore, it contains a OrderServiceA which directly accepts the SOAP-messages created from Client A (without transformation) and a ClientB that directly sends correct SOAP-messages to OrderServiceB. The latter two were used for creating and testing the former two and are not required for this sample. Both services write the received orders to c:\temp and support for the Cancellation-Option within ClientA has not been implemented yet.


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Azure (AppFabric) EAI + EDI Dec. 2011 CTP: Sending a SOAP-Message to an XML-Bridge using SWT-Tokens (Sample)

08.01.2012 04:38:00

Below, you find a sample for the Azure (AppFabric) EAI/EDI December 2011 CTP with a client (Client A) that sends a SOAP-message to an XML-Bridge. The bridge transforms the message and sends it to the destination service (OrderServiceB). This service is located on-premise and connected to the cloud by the usage of a relay-binding.

To send a SOAP-message to the bridge, the client has to request a SWT-Token from Azure (AppFabric) Access Control. For that, it uses the helper-classes AccessControllClient and WrapUtil located in the directory tools. After retrieving it, it includes the token in the actual message within a HTTP-header. Furthermore, the client has to send this message using SSL (Transport-Security without credentials).

After the transformation of the request, the bridge has to change to SOAP-Action-header for the receiving service within a route action; after the receipt and transformation of the response, the SOAP-Action-header now containing the action associated with the response is changed one more time for the receiver using a send action. 

The file EAI_Order_Sample.zip contains the EAI-Project; EAI_ServicesAndClients_without_Key.zip consists of the Client (ClientA) and Service (OrderServiceB). Furthermore, it contains a OrderServiceA which directly accepts the SOAP-messages created from Client A (without transformation) and a ClientB that directly sends correct SOAP-messages to OrderServiceB. The latter two were used for creating and testing the former two and are not required for this sample. Both services write the received orders to c:\temp and support for the Cancellation-Option within ClientA has not been implemented yet.

 

EAI_Order_Sample.zip (44,89 kb)

EAI_ServicesAndClients_without_Key.zip (2,57 mb)


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

08.01.2012 03:58:21
Azure (AppFabric) EAI/EDI December 2011 CTP: Sample sending SOAP and SWT-Token to XML-Bridge http://t.co/IJN4qoCt
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

08.01.2012 03:58:21
Azure (AppFabric) EAI + EDI Dec. 2011 CTP: Sending a SOAP-Message to an XML-Bridge using SWT-Tokens (Sample) http://t.co/KCwbPXZf
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

05.01.2012 01:44:32
Schöner .NET-Jahresrückblick 2011 vom @DOTNETDOKTOR http://t.co/CgbqkCi1
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Das war das .NET-Jahr 2011 – ein Jahresrückblick

04.01.2012 11:00:48
Die wichtigsten Ereignisse und Entwicklungen von Microsofts und verwandten Entwicklertechniken im letzten Jahr.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

04.01.2012 10:18:43
Das war das .NET-Jahr 2011 – ein Jahresrückblick auf die Nachrichten 2011 aus Sicht eines .NET-Entwicklers http://t.co/I02nRNEO
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

24.12.2011 07:24:55
ZDNET: "Windows 8: Diese Neuerungen plant Microsoft für die Beta" http://t.co/QhxNXuu6 Erwartungsvolle Überschrift, aber fast keine News.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

23.12.2011 15:08:31
Ende Februar ist wieder BASTA in Darmstadt. Ich werde über #EF4.0/ 4.5 und #ASP.NET 4.5 reden: http://t.co/U3RktVKD
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

22.12.2011 11:52:58
Ende Februar ist wieder BASTA in Mainz. Ich werde über EF4.0/ 4.5 und http://t.co/qghYcxMc 4.5 reden: http://t.co/U3RktVKD
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Ausblick auf die BASTA im Februar 2012

22.12.2011 10:08:28
Vom 27.2. bis 1.3.2012 findet wieder die Frühjahrs-Ausgabe der .NET-Konferenz "BASTA" in Darmstadt statt.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

16.12.2011 14:27:08
Architektenforum bei MS Österreich: Verteilte Systeme mit Windows Azure Service Bus, Access Control Service und ... http://t.co/Iz2T3eFu
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Architektenforum bei MS Österreich: Verteilte Systeme mit Windows Azure Service Bus, Access Control Service und Applications

16.12.2011 14:25:00

Am Dienstag, 10. Jänner 2012 werde ich ab 16:00 am Architekturforum bei MS Österreich über Windows Azure Service Bus, Access Control und Applications sprechen. Nachfolgend die Beschreibung sowie der Link für die Anmeldung.

Windows Azure stellt eine Middleware-Lösung für die Cloud zur Verfügung. Sie bringt u. a. einen Service Bus sowie einen Security Token Service für erweiterte Sicherheitsszenarien, die Single-Sign-On sowie das "ausdehnen" einer Windows-Domäne auf die Cloud ermöglichen.

 

Windows Azure Applications  (vormals AppFabric Applications) wird daneben die Entwicklung serviceorientierter Systeme für die Cloud vereinfachen, indem es deren auf verschiedene Instanzen verteilte Komponenten als eine einzige logische Einheit betrachtet. Dies macht unter anderem auch ein zentrales Konfigurieren und Überwachen komplexer Anwendungen möglich.

 

Agenda:

16:00 – 16:30 Empfang und Registrierung

16:30 – 18:00 Vortrag „Verteilte Systeme mit Windows Azure ServiceBus, Access Control Service und Applications“

18:00 – 20:00 Networking am Buffet

 

Anmeldung: https://msevents.microsoft.com/cui/EventDetail.aspx?culture=de-AT&EventID=1032501952&IO=Ue1YR0GX%2fi5UNGtj3vhbZg%3d%3d

 

 


Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

14.12.2011 18:43:40
Sonderheft: iX DEVELOPER 01/2012 Programmieren heute: http://t.co/VnuNzZza
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

14.12.2011 13:28:48
Datenzugriffpraxis @dotnetpro_mag 1/2012: Große Datenmengen importieren & ändern. Vergleich EF mit http://t.co/yAd5L7h0 "Classic", S. 106ff.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

13.12.2011 16:11:39
REST-basierte Clients mit WCF WebAPI (Preview 6) http://t.co/KCZe5IRJ
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Silverlight 5 ist erschienen

13.12.2011 13:44:31
Fast schon heimlich ist die fünfte (und möglicherweise letzte) Version von Microsoft Silverlight erschienen.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

REST-basierte Clients mit WCF WebAPI (Preview 6)

13.12.2011 01:00:00

Für den Zugriff auf REST-basierte Services bietet WCF WebAPI mit der Klasse HttpClient eine Erleichterung für Entwickler. In den Genuss dieser Neuerung kommt man, indem man über NuGet die WebAPI ins Client-Projekt lädt.

Asynchronität

WebClient ist in Hinblick auf Asynchronität  entworfen, was man unter anderem daran bemerkt, dass sämtliche Methoden, welche zum Übertragen von Daten zur Verfügung stehen, lediglich in einer aynchronen Variante, welche als Ergebnis einen Task liefert, angeboten werden. Über die Eigenschaft Result von Task kommt man dann zum Ergebnis, wobei diese Eigenschaft so lange blockiert, bis dieses tatsächlich zur Verfügung steht. Dies korreliert mit dem Mindset, welches mit Windows 8 und Metro Einzug halten soll: Alles was länger als x ms dauert, wird zur Verbesserung des Antwortverhaltens der Anwendung asynchron.

Anfragen absenden

Für die vier populärsten HTTP Verben steht jeweils eine Methode zur Verfügung: GetAsync, PostAsync, PutAsync und DeleteAsync. Übergeben wird an diese Methoden die URL der anzusprechenden Ressource. Überladungen erlauben auch die Übergabe eines CancellationTokens zum Abbruch der angestoßenen asynchronen Aktion sowie das Angeben eines Wertes des enums HttpCompletionOption. Mit letzterem wird festgelegt, ob lediglich der Header (HttpCompletionOption.ResponseHeadersRead) oder auch die Nutzdaten (HttpCompletionOption.ResponseContentRead) der Antwort zu lesen sind.

 

Daten senden

 

Der Einsatz von PostAsync und PutAsync erwartet die Übergabe von zu sendenden Nutzdaten in der Form einer Instanz des Typs HttpContent (siehe Methode PostBuchungDemo, unten). Hierbei handelt es sich um eine abstrakte Klasse, deren Subklassen verschiedene Darstellungsformen von Ressourcen repräsentieren. So kann zum Beispiel an ObjectContent, wie in der unten abgebildeten Methode PostBuchungDemo ersichtlich, ein zu serialisierendes Objekt übergeben werden. Alternativen dazu sind u. a. die selbstsprechenden Klassen StringContent und StreamContent. Hierbei ist darauf zu achten, dass jene HTTP-Header, die den Inhalt betreffen dem ObjectContent bekannt zu geben sind; die restlichen können über die Eigenschaft DefaultRequestHeaders von HttpClient festgelegt werden. Wie der Name dieser Eigenschaft schon vermuten lässt, werden diese Header-Einträge standardmäßig bei jedem Aufruf, der über den jeweiligen HttpClient erfolgt, herangezogen. Diese logische Aufteilung dürfte für HTTP-Kenner nicht gerade intuitiv erscheinen, da sämtliche HTTP-Header gemeinsam und ohne Gruppierung übertragen werden.

 

Die volle Kontrolle

 

Möchte man die volle Kontrolle über die zu sendenden Anfragen haben, kann die Methode SendAsync bemüht werden (siehe Methode SendBuchungDemo, unten). In diesem Fall kann man von den vier Verben GET, POST, PUT und DELETE abweichen und auch Header-Einträge für eine bestimmte Anfrage setzen.

Fazit

Auch wenn die betrachtete API derzeit noch ein wenig Wortreich ist und ab und an ein paar Convenience-Methoden schön wären, bietet diese sich noch in Entwicklung befindliche API mehr Komfort als die bis dato zur Verfügung gestandenen Alternativen. Man muss sich nicht mehr um das Serialisieren und Deserialisieren selber kümmern, es werden out-of-the-box die wichtigsten Darstellungsformen, wie JSON, XML oder URL-Encodet Strings, unterstützt und man erhält Unterstützung beim Definieren der Header durch die API.

private static void GetHotelsDemo()
{
    HttpClient client = new HttpClient();

    HttpResponseMessage response = client
                                    .GetAsync("http://localhost:5721/hotels?$filter=Sterne ge 4",HttpCompletionOption.ResponseContentRead)
                                    .Result;
            
    if (!response.IsSuccessStatusCode)
    {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine("Fehler: " + response.StatusCode + " "
                            + response.Content.ReadAsStringAsync().Result);
        Console.ReadLine();
    }

    var hotels = response
                    .Content
                    .ReadAsOrDefaultAsync<List<Hotel>>()
                    .Result;

    foreach (var hotel in hotels)
    {
        Console.WriteLine(hotel.ToString());
    }
}

private static void PostBuchungDemo()
{
    HttpClient client = new HttpClient();

    client.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("bar"));
    client.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("x-styrian"));
    client.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("de"));

    HotelBuchung buchung = new HotelBuchung { HotelId = 2, Vorname = "Peter", Nachname="Silie" };
    HttpContent content = new ObjectContent(typeof(HotelBuchung), buchung);
    content.Headers.ContentType = JsonMediaTypeFormatter.DefaultMediaType;
            
    HttpResponseMessage response = client
                                    .PostAsync("http://localhost:5721/hotels/3/buchungen", content)
                                    .Result;

    if (!response.IsSuccessStatusCode)
    {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine("Fehler: " + response.StatusCode + " "
                            + response.Content.ReadAsStringAsync().Result);
        Console.ReadLine();
    }

    Console.WriteLine("Status: " + response.StatusCode);
    Console.WriteLine("Content: " + response.Content.ReadAsStringAsync().Result);

}

private static void SendBuchungDemo()
{
    HttpClient client = new HttpClient();

    HotelBuchung buchung = new HotelBuchung { HotelId = 2, Vorname = "Peter", Nachname = "Silie" };

    HttpContent content = new ObjectContent(typeof(HotelBuchung), buchung);
    content.Headers.ContentType = JsonMediaTypeFormatter.DefaultMediaType;

    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://localhost:5721/hotels/3/buchungen");
    request.Headers.AcceptLanguage.Add(new StringWithQualityHeaderValue("bar"));
    request.Headers.AcceptLanguage.Add(new StringWithQualityHeaderValue("x-styrian"));
    request.Headers.AcceptLanguage.Add(new StringWithQualityHeaderValue("de"));
    request.Content = content;

    HttpResponseMessage response = client
                                    .SendAsync(request)
                                    .Result;

    if (!response.IsSuccessStatusCode)
    {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine("Fehler: " + response.StatusCode + " "
                            + response.Content.ReadAsStringAsync().Result);
        Console.ReadLine();
    }

    Console.WriteLine("Status: " + response.StatusCode);
    Console.WriteLine("Content: " + response.Content.ReadAsStringAsync().Result);

}


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

12.12.2011 21:21:24
WCF WebAPI: Erste Schritte http://t.co/WghDvuSl
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

WCF WebAPI: Erste Schritte

12.12.2011 01:00:00

Unterstützung für REST gibt es in der WCF schon längere Zeit, wobei diese bis dato eher eingeschränkt war. Dies ist mitunter der Tatsache geschuldet, dass WCF das zum Einsatz kommende Transportprotokoll „weg-abstrahiert“. Gerade bei REST benötigt man jedoch die volle Kontrolle über die HTTP-basierten Nachrichten. Die in den Startlöchern stehende WCF WebAPI [1] soll hier Abhilfe schaffen. Dieser Blog-Eintrag zeigt, wie man eine einfache Hotel-Reservierung mit dieser neuen Bibliothek entwickeln kann.

Einrichten

Am einfachsten kommt man via NuGet [3] in den Genuss der aktuellen Vorab-Version von WebAPI. Es handelt sich dabei um einen Package-Manager, welcher zur Verfügung gestellte Komponenten aus einem Repository herunterlädt und direkt ins gewünschte Visual Studio-Projekt integriert. NuGet kann über den Extension Manager von Visual Studio 2010 heruntergeladen und eingerichtet werden (Tools | Extension-Manager). Danach kann NuGet über den Befehl Manage NuGet Packages, welcher sich im Kontextmenü der einzelnen Projekte im Solution-Explorer wieder findet, zum Herunterladen der WebAPI herangezogen werden. Dazu wird im NuGet-Dialog einfach nach WCF WebAPI gesucht und die Komponente WebApi.all ausgewählt. Das hier besprochene Beispiel geht davon aus, dass die Preview 6 von WebAPI im Rahmen einer Web-Anwendung Verwendung findet.

Datenvertrag und Services

Zunächst werden Datenverträge eingerichtet. Im betrachteten Beispiel handelt es sich hierbei um eine Klasse Hotel sowie um eine weitere Kasse HotelBuchung.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.Serialization;

namespace WebAPI
{
    [DataContract(Namespace="www.softwarearchitekt.at/services/hotel")]
    public class Hotel
    {
        public Hotel() { 
            LastModified = DateTime.Now;  
        }

        [DataMember]
        public int HotelId { get; set; }

        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public int Sterne { get; set; }

        [DataMember]
        public DateTime LastModified { get; set; }

        public override string ToString()
        {
            return HotelId + " " + Name + " " + Sterne;
        }


    }

    [DataContract(Namespace = "www.softwarearchitekt.at/services/hotel")]
    public class HotelBuchung {

        [DataMember]
        public int HotelBuchungId { get; set; }

        [DataMember]
        public int HotelId { get; set; }

        [DataMember]
        public string Vorname { get; set; }

        [DataMember]
        public string Nachname { get; set; }
        
    }

}

Anschließend wird eine Klasse, welche den Service repräsentiert, eingerichtet. Zur Vereinfachung verwaltet sie Hotels und Buchungen in jeweils einer statischen Liste. Die weiteren Methoden dieser Klasse, welche die angebotenen Service-Operationen darstellen, werden nachfolgend beschrieben.

 

public class HotelService
{
    private static List<Hotel> hotels;
    private static List<HotelBuchung> buchungen;

    static HotelService()
    {
        hotels = new List<Hotel>();
        hotels.Add(new Hotel { HotelId = 1, Name = "Hotel zur Post", Sterne = 2 });
        hotels.Add(new Hotel { HotelId = 2, Name = "Burj Al Arab", Sterne = 6 });
        hotels.Add(new Hotel { HotelId = 3, Name = "Ibis", Sterne = 4 });

        buchungen = new List<HotelBuchung>();
        buchungen.Add(new HotelBuchung { HotelBuchungId = 1, HotelId = 1, Vorname = "Max", Nachname = "Muster" });
        buchungen.Add(new HotelBuchung { HotelBuchungId = 2, HotelId = 1, Vorname = "Klara", Nachname = "Fall" });
        buchungen.Add(new HotelBuchung { HotelBuchungId = 3, HotelId = 2, Vorname = "Marie", Nachname = "Juana" });
        buchungen.Add(new HotelBuchung { HotelBuchungId = 4, HotelId = 2, Vorname = "Frank", Nachname = "Reich" });
    }

    […]

}

Operationen zum Abfragen von Daten

Um eine Service-Operation, welche Hotels nach ihren Sternen abfragt, bereitzustellen, wird eine entsprechende Methode eingerichtet. Zusätzlich ist sie mit dem Attribut WebGet zu versehen. Dieses Attribut legt fest, dass die Methode über das HTTP-Verb GET erreichbar sein soll. Das UriTemplate definiert die URL, über welche die Operation zur Ausführung gebracht werden kann. Platzhalter, welche auf gleichnamige Übergabeparameter abgebildet werden, sind dabei in geschweiften Klammern zu halten. Dabei fällt positiv auf, dass – im Gegensatz zur aktuellen Version 4 von WCF – auch Datentypen jenseits von String unterstützt werden. Im betrachteten Fall wird zum Beispiel ein int mit dem Namen minSterne übergeben.

[WebGet(UriTemplate = "?minSterne={minSterne}")]
public List<Hotel> GetHotelsBySterne(int minSterne)
{
    return hotels
            .Where(h => h.Sterne >= minSterne)
            .ToList();
}

ODATA-Unterstützung

Die im letzten Abschnitt besprochene Methode erlaubt lediglich das Einschränken der abzurufenden Hotels anhand des Attributs Sterne. Wem das zu wenig ist, kann auf die in WCF WebAPI integrierte ODATA-Unterstützung zurückgreifen. Bei ODATA [2] handelt es sich um einen Standard, der es unter anderem erlaubt, Abfragen via HTTP zu formulieren. Um in den Genuss dieses Standards zu kommen, ist lediglich eine REST-Operation, welche als Rückgabewert IQueryable<T> liefert, einzurichten. 

[WebGet(UriTemplate="")]
public IQueryable<Hotel> GetHotels()
{
    return hotels.AsQueryable();
}

Das schöne dabei ist, dass IQueryable<T> auch von O/R-Mappern wie Entity Framework verwendet wird. Somit können vordefinierte Abfragen beim Aufruf einer Operation um weitere Einschränkungen ergänzt werden bevor sie in der Datenbank ausgeführt werden.



POST, PUT, DELETE und Co.

Methoden, welche mit HTTP-Verben jenseits von GET angesprochen werden sollen, sind mit WebInvoke zu annotieren. Dabei wird neben dem UriTemplate das gewünschte Verb im Attribut Method als String übergeben.

Die hier gezeigte Methode zeigt auch einen Nachteil des aktuellen Programmiermodells für REST-basierte Services in WCF: Eigentlich müsste diese Methode den Status-Code „201 CREATED“ zurückliefern. Dies zu bewerkstelligen ist in WCF 4 aufgrund der Tatsache, dass das Transportprotokoll (aus der Sicht von WCF ist dieses hier HTTP) abstrahiert nicht, jedoch nicht ganz einfach. Die WCF WebAPI bietet eine elegante Lösung zu diesem Problem. Diese wird am Ende des Artikels besprochen.

 

Services registrieren

Bei der Verwendung von Web-Anwendungen bietet sich das Einrichten einer Route, welche auf den Service verweist, an. Dies wird in der global.asax, wie nachfolgend demonstriert, unter Verwendung der Klasse ServiceRoute bewerkstelligt. Das erste Konstruktor-Argument beinhalte die Basis-URL des Services, der zweite eine HttpServiceHostFactory und der dritte den Typ des Services. Die HttpServiceHostFactory kann auch analog zu klassischen WCF-Szenarien zur Kreierung einer ServiceHost-Instanz herangezogen werden. Der Parameter EnableHelpPage bewirkt, dass eine Hilfe-Seite, welche die vom Service erwarteten sowie generierten Nachrichten beschreibt, generiert wird. EnableTestClient legt hingegen fest, dass ein HTTP-basierter Client zum Testen der Services eingerichtet wird.

void Application_Start(object sender, EventArgs e)
{
    var factory = new HttpServiceHostFactory();
    factory.Configuration.EnableHelpPage = true;
    factory.Configuration.EnableTestClient = true;
            
    RouteTable.Routes.Add(new ServiceRoute("hotels", factory, typeof(HotelService)));
}

 

Wird das Projekt nun gestartet, können über die definierten URLs Daten direkt über den Browser der Wahl abgerufen werden. Die nachfolgende Abbildung zeigt den Aufruf der zuvor beschriebenen ODATA-basierten Operation.

 

Der Test-Client kann durch Anhängen von /test an die Basis-URL des Services erreicht werden. Das Schöne an diesem Client ist, dass er im Unterschied zu Alternativen, wie Fiddler, die einzelnen Services kennt, was zur Folge hat, dass er die vorhandenen Möglichkeiten inkl. Code-Vervollständigung anbieten kann, während er die nicht implementierten Optionen ausgraut.

Durch Anhängen von /help an die Basis-Adresse der Service-Url wird die aus WCF 4 bzw. aus dem WCF Starter-Kit bekannte Hilfe-Seite angezeigt.  

Mit HTTP auf Du und Du

Möchte man die via HTTP übersendeten Nachrichten direkt beeinflussen, zum Beispiel um den Status Code einer Operation zu ändern oder um bestimmte Header-Einträge zu setzen bzw. auszulesen, können an der Stelle der eigentlichen Parameter-Typen die Typen HttpRequestMessage und HttpResponseMessage herangezogen werden. Wie die nachfolgenden Beispiele zeigen, existieren diese in einer typisierten und untypisierten Variante. Sie bieten über die Eigenschaft Headers Zugriff auf die Kopfzeilen und über Content Zugriff auf die Nutzdaten. Letztere können in verschiedenen Arten gelesen werden, zum Beispiel als String, als Stream oder als Objekt.

[WebInvoke(UriTemplate = "{hotelId}/buchungen", Method="POST")]
public HttpResponseMessage PostBuchungen(int hotelId, HttpRequestMessage<HotelBuchung> request)
{
    HotelBuchung buchung;
    string message;

    buchung = request.Content.ReadAsAsync().Result;
    buchung.HotelId = hotelId;
    buchung.HotelBuchungId = buchungen.Max(b => b.HotelBuchungId) + 1;
    buchungen.Add(buchung);

    var lang = request.Headers.AcceptLanguage.FirstOrDefault();
    message = GetReplyString(lang);

    var response = new HttpResponseMessage();
    response.StatusCode = HttpStatusCode.Created; // 201 Created
    response.Content = new StringContent(message);

            

    return response;
}


[WebInvoke(UriTemplate = "{hotelId}/message", Method = "POST")]
public void PostMessage(HttpRequestMessage request)
{
    using (var stream = request.Content.ReadAsStreamAsync().Result)
    {
        var reader = new StreamReader(stream);
        var contents = reader.ReadToEnd();
        File.AppendAllText(@"c:\temp\messages", contents + "\r\n");
    }
}

[WebGet(UriTemplate="{hotelId}")]
public HttpResponseMessage<Hotel> GetHotel(int hotelId)
{
    var hotel = hotels.Where(h => h.HotelId == hotelId).FirstOrDefault();

    if (hotel == null)
    {
        return new HttpResponseMessage<Hotel>(HttpStatusCode.NotFound);
    }

    var response = new HttpResponseMessage<Hotel>(hotel);
    response.Headers.ETag = new EntityTagHeaderValue("\"" + hotel.LastModified.ToString() + "\"");
    return response;
}

 

 Fazit

WCF WebAPI bietet direkten Zugriff auf HTTP und daneben Annehmlichkeiten wie ODATA-Unterstützung oder einen intelligenten Test-Client. Daneben werden endlich Datentypen jenseits von String von den UriTemplates unterstützt. An der einen oder anderen Stelle wirkt die API derzeit noch etwas Wortreich, sodass auf einige Convenience-Methoden in der finalen Version zu hoffen ist. Diese soll angeblich im ersten Quartal 2012 via NuGet veröffentlicht werden. Dies korreliert auch mit dem aktuellen sowie aus Sicht des Autors sehr lobenswerten Trend bei Microsoft, bei Möglichkeit, nicht auf die nächste .NET-Version zu warten, um Verbesserungen auszuliefern.

 

 

 

 

 

 


Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

08.12.2011 22:41:54
@sven_s ich habe bisher nichts von SL6 gehört. Nur als Gerücht das Microsoft das vom Kundenfeedback abhängig machen will.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

07.12.2011 20:11:29
Nationaler IT-Gipfel 2012 in Essen, unserem Firmensitz. IT-Visions freut sich darauf. http://t.co/ny9pKTk3
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

07.12.2011 20:11:17
Das ist mein 100. Tweet. Muss ich jetzt irgendwas feiern? :-) :-) :-)
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

07.12.2011 18:58:38
Nationaler IT-Gipfel 2012 in Essen, unserem Firmensitz. http://t.co/2EwtiK7T freut sich darauf. http://t.co/ny9pKTk3
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

02.12.2011 12:46:40
"Silverlight 5 in der Praxis", heise.de-Beitrag von dem IT-Visions-UI-Experten Dr. Joachim Fuchs: http://t.co/huLoW4F1
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

01.12.2011 19:51:22
Auszug aus unserer Kolumne im dotnet Magazin: Tipps zur Leistungssteigerung in http://t.co/qghYcxMc Web Forms: http://t.co/1UnhnNks
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Drucken in Farbe in Visual Studio 2010

01.12.2011 08:59:11
Mit einer kostenlosen Erweiterung kann man Quellcode aus Microsofts Entwicklungsumgebung auch endlich in Farbe drucken.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Copy & Paste in RDP-Terminalserver-Sitzungen wieder aktivieren

25.11.2011 13:09:09
Gelegentlich funktioniert die Copy&Paste-Zwischenablagefunktion zwischen einer RDP-Session und dem lokalen PC nicht mehr. Mit einem Trick kann man das Problem lösen.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

BASTA on Tour: Folien und Beispiel zum End2End-Workshop

24.11.2011 00:48:00

Nachfolgend findet man das Beispiel des End2End-Workshops, den ich heute auf der BASTA! on Tour gemeinsam mit Christian Wenz veranstaltet habe. Es zeigt das Zusammenspiel von EF, WCF und ASP.NET MVC 4 mit jQuery.

 

WWWingsLight.zip (6,29 mb)


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

BASTA on Tour: Folien und Beispiel zur Session "Die Zukunft von WCF: WCF 4.5" -- WCF WebAPI und RIA/JA

24.11.2011 00:43:00

Nachfolgend platziere ich meine Unterlagen sowie die Beispiele meiner Session "Die Zukunft von WCF: WCF 4.5" von der letzten BASTA! on Tour.

 

steyer_WCF.pdf (431,22 kb)

WCF_Futures_Samples.zip (1.018,46 kb)


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

BASTA on Tour: Folien und Beispiel zur Session über ASP.NET MVC 4, Entity Framework und jQuery

24.11.2011 00:36:00

Nachfolgend findet man die Unterlagen und das Beispiel zu meiner Session über ASP.NET MVC 4, Entity Framework und jQuery auf der letzten BASTA! on Tour.

 

steyer_MVC.pdf (726,81 kb)

HotelReservierung.zip (4,76 mb)


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

24.11.2011 00:05:31
BASTA on Tour: Folien und Beispiel zum End2End-Workshop http://t.co/grLXocGj
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

24.11.2011 00:05:30
BASTA on Tour: Folien und Beispiel zur Session "Die Zukunft von WCF: WCF 4.5" -- WCF WebAPI und RIA/JA http://t.co/IZV47l6F
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

24.11.2011 00:05:30
BASTA on Tour: Folien und Beispiel zur Session über http://t.co/Np7VW3SO MVC 4, Entity Framework und jQuery http://t.co/FIFB9sOm
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Freien Speicherplatz auf einem Laufwerk ermitteln mit .NET und WMI

21.11.2011 08:39:11
Um den Füllstand eines Laufwerks zu ermitteln, gibt es seit dem .NET Framework 2.0 in der Klasse DriveInfo die Attribute TotalSize und TotalFreeSpace. Allerdings kann man damit nur den Füllstand lokaler Laufwerke ermitteln. Manchmal muss man wissen, wie es um andere Rechner bestellt ist. Hier hilft die Windows Management Instrumentation (WMI).
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

16.11.2011 19:26:54
Termine für PowerShell-Schulungen 2012 mit Dr. Tobias Weltner und Peter Monadjemi: http://t.co/Fb7Sxli7 in München, Essen, Hannover
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

16.11.2011 18:13:27
Liste mit Anbietern von Entitiy Framework-Provider (http://t.co/sb0EilmQ Data Providers): http://t.co/Ibn31nKp
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

15.11.2011 09:25:10
"@dotnet_de: Windows Communication Foundation: Programmatische und Deklarative Impersonation http://t.co/hCBD5UIF #WCF"
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

02.11.2011 11:50:22
@dotnet_de Unsere Tipps-Kolumne in dotnet Magazin 12/2011 hat dieses Mal Tipps zu WCF, http://t.co/qghYcxMc, FCL und Entity Framework. S.58f
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

02.11.2011 06:55:45
WinRT in normalen .NET-Anwendungen nutzen: In #Windows8 kann man viele WinRT-Klassen auch in Nicht-Metro-Apps nutzen: http://t.co/GE2D4y0B
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

01.11.2011 23:53:48
Entity Framework 4.2 ist da. Allerdings: "EF 4.2 = Bug Fixes + Semantic Versioning", sprich keine neuen Features http://t.co/sklDWVyN
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

31.10.2011 21:03:26
WCF und JSON: Warum DateTime.MinValue die JSON-Serialisierung zum Scheitern bringen kann: http://t.co/Ah5gULgK
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

ADC: Folien und Beispiele zur Code-Contracts-Session

27.10.2011 16:32:00

Nachfolgend mein Beispiel und meine Folien zu meiner Session über Code Contracts.

MiniBar.zip (44,21 kb)

Code_Contracts.pdf (698,17 kb)


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

ADC: Folien und Beispiel zur Session "Was ist neu in Visual Studio 2011 und .NET 4.5"

27.10.2011 16:28:00

Nachfolgend die Folien und Beispiele meines Teils der Session "Was ist neu in Visual Studio 2011 und .NET 4.5"?

 

wcf45_und_async_samples.zip (2,70 mb)

was-ist-neu.pdf (974,07 kb)


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

ADC: Folien und Beispiel zur Session "Software Design mit C# 4 - Patterns und fortgeschrittene Sprachelemente"

27.10.2011 16:23:00

Nachfolgend meine Folien und mein Beispiel zur Session "Software Design mit C# 4 - Patterns und fortgeschrittene Sprachelemente".

 

SoftwareDesign.pdf (661,94 kb)

DesignByExample.zip (71,20 kb)


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

ADC: Folien und Beispiel zur Session "Testbare Systeme mit Dependency Injection und Mocking Frameworks"

27.10.2011 14:42:00

Nachfolgend findet man meine Folien und das Beispiel zu meiner Session "Testbare Systeme mit Dependency Injection und Mocking Frameworks"

 

steyer_Solution.zip (14,36 mb)

steyer_DI.pdf (639,86 kb)


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

27.10.2011 14:38:42
ADC: Folien und Beispiele zur Code-Contracts-Session http://t.co/E3cjuSj4
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

27.10.2011 14:38:42
ADC: Folien und Beispiel zur Session "Was ist neu in Visual Studio 2011 und .NET 4.5" http://t.co/iYRK4HPV
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

27.10.2011 14:38:41
ADC: Folien und Beispiel zur Session "Software Design mit C# 4 - Patterns und fortgeschrittene Sprachelemente" http://t.co/xZuWoqRe
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

27.10.2011 13:42:17
1/2: ADC: Interessante Session von Holger Schwichtenber über EF Performance: NoTracking, Lazy vs. Eager, EF Profiler, Native SQL ...
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

27.10.2011 13:39:03
2/2: View Generation, EF Performance für ORACLE: Treiber von DevArt schneller als der von ORA selbst, benötigt auch keinen ORA Client.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

27.10.2011 12:49:45
ADC: Folien und Beispiel zur Session "Testbare Systeme mit Dependency Injection und Mocking Frameworks" http://t.co/D7zvVoUj
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

26.10.2011 10:44:31
Self-Tracking Entities mit Code Only: Wiederverwendbare Library http://t.co/oaGaGs9l
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

26.10.2011 07:52:42
"Das Leben ohne DataGrid ist für viele von uns unvorstellbar", Hannes Preishuber über den erfolg von Metro Apps #Windows 8, Keynote #ADC2011
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Self-Tracking Entities mit Code Only: Wiederverwendbare Library

26.10.2011 01:00:00

Unter [1] habe ich gezeigt, wie man Self-Tracking Entities (STE) mit Code Only relativ einfach realisieren kann. Am Ende dieses Beitrags findet man die hier beschriebenen wiederverwendbaren Klassen (Datei TrackingHelper.cs) und ein Beispiel. Nachfolgend fasse ich zusammen, was zu tun ist, um diesen Ansatz in der Praxis einzusetzen.

 

-        Alle Entitäten implementieren das Interface IEntity, welches (analog zu STE) eine State-Eigenschaft vorgibt.

-        Wird die Entität verändert, muss der Status auf Changed gesetzt werden. Dies kann entweder, über eine Property (wie bei STE), über AOP (z. B. PostSharp) oder manuell geschehen.

o   Ausnahme: Ist die Entity ist im Zustand New, bleibt sie in diesem im Zustand
(wie bei STE)

-        Nach dem Speichern muss bei den Entitäten (wie bei STE) die Methode ResetState(s) aufgerufen werden, damit der Zustand (wieder) auf Unchanged gesetzt wird. Das selbe ist nach dem Laden zu machen.

-        Für Relationen ist ein „Fixup“ zu machen, d. h. wenn A auf B verweist, muss auch B auf A verweisen. Auch eventuelle Fremdschlüsselmappings müssen damit korrelieren. Dies kann entweder in den Properties erfolgen (wie bei STE), über AOP oder manuell. Ein Beispiel dafür findet man nachfolgend.

 

// Beispiel für manuelles "Fix-up"

// h2 ist vom Typ Hotel; r vom Typ Region

 

h2.Region = r;             // Region nach Hotel

h2.RegionId = r.RegionId;  // Hotel nach Region

r.Hotels.Add(h2);          // Fremdschlüsselmapping

  

[1] http://www.softwarearchitekt.at/post/2011/08/25/Self-Tracking-Entities-mit-Code-Only-implementieren.aspx

TrackingHelper.cs (1,93 kb)

CodeOnlyWithSTE_Sample.zip (43,21 kb)


Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

WinRT in "klassischen" .NET-Anwendungen nutzen

25.10.2011 08:19:15
Die neue COM-basierte Windows Runtime Library kann man nicht nur in den Metro-Anwendungen von Windows 8, sondern auch in "klassischen" Desktop-Anwendungen nutzen.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

22.10.2011 21:18:49
Lang ersehnt, bald verfügbar: Federations in SQL Azure: http://t.co/TKirvV8T #SQLAzure #Sharding #BigData
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

18.10.2011 18:03:13
#Scandev is over. Thanks to the iptor-team for this great conferene and for the chance to speak there.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Scandev: Slides and samples regarding my session "WCF futures" (WCF 4.5, WebAPI, RIA/JS) #scandev

18.10.2011 13:57:00

Below I place the slides and samples I used during my "WCF futures"-Session.

 

steyer_WCF4.5.pdf (406,53 kb)

2011_10_18__WCF4.5_Samples_ScanDev.zip (576,86 kb)

WebAPI.zip (4,31 mb)

RIA_JS.zip (599,78 kb)


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

18.10.2011 12:44:46
Scandev: Slides and samples regarding my session "WCF futures" (WCF 4.5, WebAPI, RIA/JS) #scandev http://t.co/0Gm201D2
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

18.10.2011 12:26:51
nice talk about http://t.co/LnhpT7TZ mvc from @ironshay at #scandev: Postal, Razor Helpers, Validation Helpers, Scaffold Toolkit, MVC-Grid
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

17.10.2011 21:51:09
Just arrived at the speakers hotel. Looking forward to #scandev, tomorrow.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

17.10.2011 19:59:25
dotnetpro sagt prio.conference 2011 aus Teilnehmermangel ab http://t.co/f64SxhDV
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

dotnetpro sagt prio.conference 2011 aus Teilnehmermangel ab

17.10.2011 16:39:34
Während BASTA und ADC mehr Teilnehmer als im letzten Jahr vermelden, fällt die diesjährige prio conference 2011 der Fachzeitschrift dotnetpro aus.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

15.10.2011 15:28:25
WCF 4.5: Multicasts mit neuem udpBinding http://t.co/2HonRBNd
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

WCF 4.5: Multicasts mit neuem udpBinding

15.10.2011 01:00:00

Für Fälle, in denen TCP zu viel Overhead mit sich bringt, bietet WCF 4.5 nun ein udpBinding an. Wie der Namen vemuten lässt, stützt es sich auf das verbindungslose Protokoll UDP und erlaubt somit eine, in Relation zu TCP gesehen, schlanke Form der Kommunikation - ohne Three-Way-Handshake und Bestätigungsnachrichten. Dies bedeutet aber auch, dass es der Sender nicht bemerkt, wenn Nachrichten verloren gehen. Insofern macht dieses Binding nur in Fällen sinn, wo das egal ist oder gar gewünscht ist, weil die Daten zum Beispiel nach einem erneuten Senden bereits veraltet wären.

Außerdem erlaubt UDP das Versenden von Multicasts. Damit sind Nachrichten gemeint, die von beliebig vielen Interessenten im lokalen Netzwerk empfangen werden können. Dazu verwendet man sowohl für den Service- also auch für den Client-Endpunkt eine IP-Adresse aus dem Bereich 224.x.x.x bis 239.x.x.x. Jene, die die Zeit der IPv4-Klassen miterlebt haben, werden diesen Adress-Bereich auch als Klasse D bezeichnen oder anders ausgedrückt: Alle Adressen dieses Bereichs beginnen haben ein binäres Muster, welches mit 1110 beginnt. Bei der Vergabe von Multicast-Adressen muss man sich jedoch vor Augen führen, dass die Adressen 224.x.x.x und 239.x.x.x für spezielle Zwecke reserviert sind, sodass sich dieser Wertebereich für die freie Verwendung auf 225.x.x.x bis 238.x.x.x beschränkt. Darüber hinaus soll an dieser Stelle nochmals ausdrücklich erwähnt werden, dass UDP-Nachrichten nicht über Netzwerkgrenzen geroutet werden und somit nur innerhalb eines Netzwerks herangezogen werden können.

Das nachfolgende Beispiel zeigt die Implementierung eines UDP-Multicasts. Es verwendet die Multicast-Adresse 225.1.1.1:9999. Somit können beliebig viele Instanzen des Service gestartet werden, wobei jeder Server alle vom Client gesendeten Nachrichten erhält, sofern diese nicht verloren gehen. Antworten mehrere Services auf eine Anfrage des Clients, zieht dieser lediglich die zuerst erhaltene heran; alle anderen werden ignoriert. Eine Möglichkeit, dies zu Umgehen, stellt der Einsatz von Callbacks (Duplex) dar. Allerdings unterstützt das udbBinding in der aktuellen Developer Preview (noch?) keine Duplex-Szenarien, weswegen diese manuell implementiert werden müssten.

Service-Konfiguration

<system.serviceModel>

 <services>
 <service name="UdpSample.FlugService">

 <endpoint address="FlugService" binding="udpBinding" contract="UdpSample.IFlugService"/>

 <host>
 <baseAddresses>
 <add baseAddress="soap.udp://225.1.1.1:9999/"/>
 </baseAddresses>
 </host>

 </service>
 </services>

 <behaviors>
 <serviceBehaviors>
 <behavior>
 <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false"/>
 <serviceDebug includeExceptionDetailInFaults="true"/>
 </behavior>
 </serviceBehaviors>
 </behaviors>
 <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
</system.serviceModel>


Client-Konfiguration

<system.serviceModel>

 <client>
 <endpoint address="soap.udp://225.1.1.1:9999/FlugService"
 binding="udpBinding"
 contract="UdpSample.IFlugService"
 name="FlugService" />
 </client>

</system.serviceModel>


Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

14.10.2011 08:56:35
Mein Konferenz-Bericht zur BUILD in @dotnetpro_mag 11/2011, Seite 20-24: "COM doch" in Anspielung darauf, dass WinRT auf COM basiert
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

.NET 4.5 und Windows 8 auf der Advanced Developers Conference (ADC)

12.10.2011 14:04:33
Die ersten Vorträge zur Windows 8-Programmierung und .NET 4.5 in Deutschland können .NET-Entwickler auf der ADC 2011 am 26. und 27.10. in Frankenthal sehen.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

BASTA: Unterlagen zum .NET 4 End-2-End-Workshop, Teil 2 (Nachmittag) #bastacon

08.10.2011 17:14:00

Nachfolgend findet man den 2. Teil unseres End-2-End-Workshops von der BASTA! den ich heute von meinem IT-Visions-Kollegen Joachim Fuchs erhalten habe. 

Basta2011Herbst.zip (3,13 mb)


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

WCF 4.5: Benachrichtigungs-Szenarien mit WebSockets (netHttpBinding)

08.10.2011 16:02:00
Obwohl WebSockets in erster Linie für die Kommunikation zwischen Browser und Server gedacht sind, können sie auch für klassische verteilte Systeme verwendet werden. Da die Grundidee darauf basiert eine HTTP-Verbindung offen zu lassen und nach einem "Upgread" als bidirektionale TCP-Verbindung heranzuziehen, können firewall-sichere Benachrichtigungs-Szenarien implementiert werden.
 
Vor Version 4.5 musst man dazu das wsDualHttpBinding einsetzen. Dieses sah jedoch vor, dass der Service für Benachrichtigungen eine eigenständige HTTP-Verbindung zum Client aufbaut - eine Strategie, die von vielen Firewalls nicht erlaubt wird.
 
WCF 4.5 bietet hierzu zwei Bindings netHttpBinding und netHttpsBinding. Allerdings muss es gemeinsam mit einem Web-Server eingesetzt werden, der diesen jungen Standard unterstützt. Glücklicherweise ist das bei jener IIS-Version, die mit Windows 8 ausgeliefert wird, der Fall. Dazu müssen jedoch die IIS-Features "HTTP Activation" und "WebSockets" aktiviert werden. Auch gilt zu beachten, dass die im Rahmen von "Visual Studio 11" ausgelieferte IIS Express Edition WebSockets (noch?) nicht unterstützt. Informationen dazu finden sich unter [1].
 
Das nachfolgende Beispiel zeigt den Einsatz des netHttpBindings zur Implementierung eines Call-Back-Szenarios (aka Duplex). netHttpBinding verwendet standardmäßig eine binäre Kodierung über HTTP. Bei Bedarf wird die HTTP-Verbindung unter Verwendung des WebSocket-Protokolls zu TCP hochgestuft. Dieses Hochstufen muss explizit erlaubt werden. Dies wird mit dem Attribut connectionMode in der Konfiguration gesteuert. Außerdem müssen beide Kommunikationspartner das selbe Sub-Protokoll, welches im Attribut textuell subProtocol anzugeben ist, verwenden. Da die client-seitig im Zuge der Generierung des Proxies eingerichtete Konfigurationsdatei in der aktuellen Developer Preview nicht allzu glücklich ausfällt, wurde dies im betrachteten Beispiel manuell nachgebessert.
  
Service
[ServiceContract(CallbackContract=typeof(IFlugServiceCallback))]
public interface IFlugService
{
    [OperationContract(IsOneWay=true)]
    void BucheFlug(string flugNummer, DateTime datum, string vorname, string nachname);
}

[ServiceContract]
public interface IFlugServiceCallback
{
    [OperationContract(IsOneWay=true)]
    void BucheFlugCallback(bool erfolg, string ticketId);
        
}

public class FlugService : IFlugService
{
    public void BucheFlug(string flugNummer, DateTime datum, string vorname, string nachname)
    {
    
        Thread.Sleep(5000); // Simuliert langen Prozess ...

        var callback = 
            OperationContext
                .Current
                .GetCallbackChannel<IFlugServiceCallback>();

        callback.BucheFlugCallback(true, "LH4711");

    }
}
Service-Konfiguration
 
<system.serviceModel>

  <services>
    <service name="Service.FlugService">
      <endpoint
            address=""
            binding="netHttpBinding"
            contract="Service.IFlugService" />
    </service>
      
  </services>

  <bindings>
    <netHttpBinding>
      <binding>
        <webSocketSettings connectionMode="Allowed" subProtocol="flights" />
        <security mode="None" />
      </binding>
    </netHttpBinding>
      
  </bindings>
    
  <behaviors>
    <serviceBehaviors>
      <behavior>
          
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
</system.serviceModel>
 
Client
 
class Program
{
    static void Main(string[] args)
    {
        var client = new FlugServiceClient(
                        new InstanceContext(
                            new FlugServiceCallback()));

        client.BucheFlug("LH4711", DateTime.Now, "Max", "Muster");

        Console.WriteLine("fertig!");
        Console.ReadLine();
    }
}
 
Client-Konfiguration
 
<system.serviceModel>
    <bindings>
        <netHttpBinding>
            <binding> 
                <webSocketSettings 
                  connectionMode="Allowed" 
                  subProtocol="flights" 
                  />
                <security mode="None" />
            </binding>
        </netHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost/Service/FlugService.svc"
            binding="netHttpBinding" contract="Proxy.IFlugService" />
    </client>
</system.serviceModel>
 
Download: Link
 

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

WCF 4.5: Benachrichtigungs-Szenarien mit WebSockets (netHttpBinding)

08.10.2011 16:02:00
Obwohl WebSockets in erster Linie für die Kommunikation zwischen Browser und Server gedacht sind, können sie auch für klassische verteilte Systeme verwendet werden. Da die Grundidee darauf basiert eine HTTP-Verbindung offen zu lassen und nach einem "Upgread" als bidirektionale TCP-Verbindung heranzuziehen, können firewall-sichere Benachrichtigungs-Szenarien implementiert werden.
 
Vor Version 4.5 musst man dazu das wsDualHttpBinding einsetzen. Dieses sah jedoch vor, dass der Service für Benachrichtigungen eine eigenständige HTTP-Verbindung zum Client aufbaut - eine Strategie, die von vielen Firewalls nicht erlaubt wird.
 
WCF 4.5 bietet hierzu zwei Bindings netHttpBinding und netHttpsBinding. Allerdings muss es gemeinsam mit einem Web-Server eingesetzt werden, der diesen jungen Standard unterstützt. Glücklicherweise ist das bei jener IIS-Version, die mit Windows 8 ausgeliefert wird, der Fall. Dazu müssen jedoch die IIS-Features "HTTP Activation" und "WebSockets" aktiviert werden. Auch gilt zu beachten, dass die im Rahmen von "Visual Studio 11" ausgelieferte IIS Express Edition WebSockets (noch?) nicht unterstützt. Informationen dazu finden sich unter [1].
 
Das nachfolgende Beispiel zeigt den Einsatz des netHttpBindings zur Implementierung eines Call-Back-Szenarios (aka Duplex). netHttpBinding verwendet standardmäßig eine binäre Kodierung über HTTP. Bei Bedarf wird die HTTP-Verbindung unter Verwendung des WebSocket-Protokolls zu TCP hochgestuft. Dieses Hochstufen muss explizit erlaubt werden. Dies wird mit dem Attribut connectionMode in der Konfiguration gesteuert. Außerdem müssen beide Kommunikationspartner das selbe Sub-Protokoll, welches im Attribut textuell subProtocol anzugeben ist, verwenden. Da die client-seitig im Zuge der Generierung des Proxies eingerichtete Konfigurationsdatei in der aktuellen Developer Preview nicht allzu glücklich ausfällt, wurde dies im betrachteten Beispiel manuell nachgebessert.
  
Service
[ServiceContract(CallbackContract=typeof(IFlugServiceCallback))]
public interface IFlugService
{
    [OperationContract(IsOneWay=true)]
    void BucheFlug(string flugNummer, DateTime datum, string vorname, string nachname);
}

[ServiceContract]
public interface IFlugServiceCallback
{
    [OperationContract(IsOneWay=true)]
    void BucheFlugCallback(bool erfolg, string ticketId);
        
}

public class FlugService : IFlugService
{
    public void BucheFlug(string flugNummer, DateTime datum, string vorname, string nachname)
    {
    
        Thread.Sleep(5000); // Simuliert langen Prozess ...

        var callback = 
            OperationContext
                .Current
                .GetCallbackChannel<IFlugServiceCallback>();

        callback.BucheFlugCallback(true, "LH4711");

    }
}
Service-Konfiguration
 
<system.serviceModel>

  <services>
    <service name="Service.FlugService">
      <endpoint
            address=""
            binding="netHttpBinding"
            contract="Service.IFlugService" />
    </service>
      
  </services>

  <bindings>
    <netHttpBinding>
      <binding>
        <webSocketSettings connectionMode="Allowed" subProtocol="flights" />
        <security mode="None" />
      </binding>
    </netHttpBinding>
      
  </bindings>
    
  <behaviors>
    <serviceBehaviors>
      <behavior>
          
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
</system.serviceModel>
 
Client
 
class Program
{
    static void Main(string[] args)
    {
        var client = new FlugServiceClient(
                        new InstanceContext(
                            new FlugServiceCallback()));

        client.BucheFlug("LH4711", DateTime.Now, "Max", "Muster");

        Console.WriteLine("fertig!");
        Console.ReadLine();
    }
}
 
Client-Konfiguration
 
<system.serviceModel>
    <bindings>
        <netHttpBinding>
            <binding> 
                <webSocketSettings 
                  connectionMode="Allowed" 
                  subProtocol="flights" 
                  />
                <security mode="None" />
            </binding>
        </netHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost/Service/FlugService.svc"
            binding="netHttpBinding" contract="Proxy.IFlugService" />
    </client>
</system.serviceModel>
 
Download: Link
 

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

WCF 4.5: Benachrichtigungs-Szenarien mit WebSockets (netHttpBinding)

08.10.2011 16:02:00
Obwohl WebSockets in erster Linie für die Kommunikation zwischen Browser und Server gedacht sind, können sie auch für klassische verteilte Systeme verwendet werden. Da die Grundidee darauf basiert eine HTTP-Verbindung offen zu lassen und nach einem "Upgread" als bidirektionale TCP-Verbindung heranzuziehen, können firewall-sichere Benachrichtigungs-Szenarien implementiert werden.
 
Vor Version 4.5 musst man dazu das wsDualHttpBinding einsetzen. Dieses sah jedoch vor, dass der Service für Benachrichtigungen eine eigenständige HTTP-Verbindung zum Client aufbaut - eine Strategie, die von vielen Firewalls nicht erlaubt wird.
 
WCF 4.5 bietet hierzu zwei Bindings netHttpBinding und netHttpsBinding. Allerdings muss es gemeinsam mit einem Web-Server eingesetzt werden, der diesen jungen Standard unterstützt. Glücklicherweise ist das bei jener IIS-Version, die mit Windows 8 ausgeliefert wird, der Fall. Dazu müssen jedoch die IIS-Features "HTTP Activation" und "WebSockets" aktiviert werden. Auch gilt zu beachten, dass die im Rahmen von "Visual Studio 11" ausgelieferte IIS Express Edition WebSockets (noch?) nicht unterstützt. Informationen dazu finden sich unter [1].
 
Das nachfolgende Beispiel zeigt den Einsatz des netHttpBindings zur Implementierung eines Call-Back-Szenarios (aka Duplex). netHttpBinding verwendet standardmäßig eine binäre Kodierung über HTTP. Bei Bedarf wird die HTTP-Verbindung unter Verwendung des WebSocket-Protokolls zu TCP hochgestuft. Dieses Hochstufen muss explizit erlaubt werden. Dies wird mit dem Attribut connectionMode in der Konfiguration gesteuert. Außerdem müssen beide Kommunikationspartner das selbe Sub-Protokoll, welches im Attribut textuell subProtocol anzugeben ist, verwenden. Da die client-seitig im Zuge der Generierung des Proxies eingerichtete Konfigurationsdatei in der aktuellen Developer Preview nicht allzu glücklich ausfällt, wurde dies im betrachteten Beispiel manuell nachgebessert.
  
Service
[ServiceContract(CallbackContract=typeof(IFlugServiceCallback))]
public interface IFlugService
{
    [OperationContract(IsOneWay=true)]
    void BucheFlug(string flugNummer, DateTime datum, string vorname, string nachname);
}

[ServiceContract]
public interface IFlugServiceCallback
{
    [OperationContract(IsOneWay=true)]
    void BucheFlugCallback(bool erfolg, string ticketId);
        
}

public class FlugService : IFlugService
{
    public void BucheFlug(string flugNummer, DateTime datum, string vorname, string nachname)
    {
    
        Thread.Sleep(5000); // Simuliert langen Prozess ...

        var callback = 
            OperationContext
                .Current
                .GetCallbackChannel<IFlugServiceCallback>();

        callback.BucheFlugCallback(true, "LH4711");

    }
}
Service-Konfiguration
 
<system.serviceModel>

  <services>
    <service name="Service.FlugService">
      <endpoint
            address=""
            binding="netHttpBinding"
            contract="Service.IFlugService" />
    </service>
      
  </services>

  <bindings>
    <netHttpBinding>
      <binding>
        <webSocketSettings connectionMode="Allowed" subProtocol="flights" />
        <security mode="None" />
      </binding>
    </netHttpBinding>
      
  </bindings>
    
  <behaviors>
    <serviceBehaviors>
      <behavior>
          
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
</system.serviceModel>
 
Client
 
class Program
{
    static void Main(string[] args)
    {
        var client = new FlugServiceClient(
                        new InstanceContext(
                            new FlugServiceCallback()));

        client.BucheFlug("LH4711", DateTime.Now, "Max", "Muster");

        Console.WriteLine("fertig!");
        Console.ReadLine();
    }
}
 
Client-Konfiguration
 
<system.serviceModel>
    <bindings>
        <netHttpBinding>
            <binding> 
                <webSocketSettings 
                  connectionMode="Allowed" 
                  subProtocol="flights" 
                  />
                <security mode="None" />
            </binding>
        </netHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost/Service/FlugService.svc"
            binding="netHttpBinding" contract="Proxy.IFlugService" />
    </client>
</system.serviceModel>
 
Download: Link
 

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

WCF 4.5: Benachrichtigungs-Szenarien mit WebSockets (netHttpBinding)

08.10.2011 16:02:00
Obwohl WebSockets in erster Linie für die Kommunikation zwischen Browser und Server gedacht sind, können sie auch für klassische verteilte Systeme verwendet werden. Da die Grundidee darauf basiert eine HTTP-Verbindung offen zu lassen und nach einem "Upgread" als bidirektionale TCP-Verbindung heranzuziehen, können firewall-sichere Benachrichtigungs-Szenarien implementiert werden.
 
Vor Version 4.5 musst man dazu das wsDualHttpBinding einsetzen. Dieses sah jedoch vor, dass der Service für Benachrichtigungen eine eigenständige HTTP-Verbindung zum Client aufbaut - eine Strategie, die von vielen Firewalls nicht erlaubt wird.
 
WCF 4.5 bietet hierzu zwei Bindings netHttpBinding und netHttpsBinding. Allerdings muss es gemeinsam mit einem Web-Server eingesetzt werden, der diesen jungen Standard unterstützt. Glücklicherweise ist das bei jener IIS-Version, die mit Windows 8 ausgeliefert wird, der Fall. Dazu müssen jedoch die IIS-Features "HTTP Activation" und "WebSockets" aktiviert werden. Auch gilt zu beachten, dass die im Rahmen von "Visual Studio 11" ausgelieferte IIS Express Edition WebSockets (noch?) nicht unterstützt. Informationen dazu finden sich unter [1].
 
Das nachfolgende Beispiel zeigt den Einsatz des netHttpBindings zur Implementierung eines Call-Back-Szenarios (aka Duplex). netHttpBinding verwendet standardmäßig eine binäre Kodierung über HTTP. Bei Bedarf wird die HTTP-Verbindung unter Verwendung des WebSocket-Protokolls zu TCP hochgestuft. Dieses Hochstufen muss explizit erlaubt werden. Dies wird mit dem Attribut connectionMode in der Konfiguration gesteuert. Außerdem müssen beide Kommunikationspartner das selbe Sub-Protokoll, welches im Attribut textuell subProtocol anzugeben ist, verwenden. Da die client-seitig im Zuge der Generierung des Proxies eingerichtete Konfigurationsdatei in der aktuellen Developer Preview nicht allzu glücklich ausfällt, wurde dies im betrachteten Beispiel manuell nachgebessert.
  
Service
[ServiceContract(CallbackContract=typeof(IFlugServiceCallback))]
public interface IFlugService
{
    [OperationContract(IsOneWay=true)]
    void BucheFlug(string flugNummer, DateTime datum, string vorname, string nachname);
}

[ServiceContract]
public interface IFlugServiceCallback
{
    [OperationContract(IsOneWay=true)]
    void BucheFlugCallback(bool erfolg, string ticketId);
        
}

public class FlugService : IFlugService
{
    public void BucheFlug(string flugNummer, DateTime datum, string vorname, string nachname)
    {
    
        Thread.Sleep(5000); // Simuliert langen Prozess ...

        var callback = 
            OperationContext
                .Current
                .GetCallbackChannel<IFlugServiceCallback>();

        callback.BucheFlugCallback(true, "LH4711");

    }
}
Service-Konfiguration
 
<system.serviceModel>

  <services>
    <service name="Service.FlugService">
      <endpoint
            address=""
            binding="netHttpBinding"
            contract="Service.IFlugService" />
    </service>
      
  </services>

  <bindings>
    <netHttpBinding>
      <binding>
        <webSocketSettings connectionMode="Allowed" subProtocol="flights" />
        <security mode="None" />
      </binding>
    </netHttpBinding>
      
  </bindings>
    
  <behaviors>
    <serviceBehaviors>
      <behavior>
          
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
</system.serviceModel>
 
Client
 
class Program
{
    static void Main(string[] args)
    {
        var client = new FlugServiceClient(
                        new InstanceContext(
                            new FlugServiceCallback()));

        client.BucheFlug("LH4711", DateTime.Now, "Max", "Muster");

        Console.WriteLine("fertig!");
        Console.ReadLine();
    }
}
 
Client-Konfiguration
 
<system.serviceModel>
    <bindings>
        <netHttpBinding>
            <binding> 
                <webSocketSettings 
                  connectionMode="Allowed" 
                  subProtocol="flights" 
                  />
                <security mode="None" />
            </binding>
        </netHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost/Service/FlugService.svc"
            binding="netHttpBinding" contract="Proxy.IFlugService" />
    </client>
</system.serviceModel>
 
Download: Link
 

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

WCF 4.5: Benachrichtigungs-Szenarien mit WebSockets (netHttpBinding)

08.10.2011 16:02:00
Obwohl WebSockets in erster Linie für die Kommunikation zwischen Browser und Server gedacht sind, können sie auch für klassische verteilte Systeme verwendet werden. Da die Grundidee darauf basiert eine HTTP-Verbindung offen zu lassen und nach einem "Upgread" als bidirektionale TCP-Verbindung heranzuziehen, können firewall-sichere Benachrichtigungs-Szenarien implementiert werden.
 
Vor Version 4.5 musst man dazu das wsDualHttpBinding einsetzen. Dieses sah jedoch vor, dass der Service für Benachrichtigungen eine eigenständige HTTP-Verbindung zum Client aufbaut - eine Strategie, die von vielen Firewalls nicht erlaubt wird.
 
WCF 4.5 bietet hierzu zwei Bindings netHttpBinding und netHttpsBinding. Allerdings muss es gemeinsam mit einem Web-Server eingesetzt werden, der diesen jungen Standard unterstützt. Glücklicherweise ist das bei jener IIS-Version, die mit Windows 8 ausgeliefert wird, der Fall. Dazu müssen jedoch die IIS-Features "HTTP Activation" und "WebSockets" aktiviert werden. Auch gilt zu beachten, dass die im Rahmen von "Visual Studio 11" ausgelieferte IIS Express Edition WebSockets (noch?) nicht unterstützt. Informationen dazu finden sich unter [1].
 
Das nachfolgende Beispiel zeigt den Einsatz des netHttpBindings zur Implementierung eines Call-Back-Szenarios (aka Duplex). netHttpBinding verwendet standardmäßig eine binäre Kodierung über HTTP. Bei Bedarf wird die HTTP-Verbindung unter Verwendung des WebSocket-Protokolls zu TCP hochgestuft. Dieses Hochstufen muss explizit erlaubt werden. Dies wird mit dem Attribut connectionMode in der Konfiguration gesteuert. Außerdem müssen beide Kommunikationspartner das selbe Sub-Protokoll, welches im Attribut textuell subProtocol anzugeben ist, verwenden. Da die client-seitig im Zuge der Generierung des Proxies eingerichtete Konfigurationsdatei in der aktuellen Developer Preview nicht allzu glücklich ausfällt, wurde dies im betrachteten Beispiel manuell nachgebessert.
  
Service
[ServiceContract(CallbackContract=typeof(IFlugServiceCallback))]
public interface IFlugService
{
    [OperationContract(IsOneWay=true)]
    void BucheFlug(string flugNummer, DateTime datum, string vorname, string nachname);
}

[ServiceContract]
public interface IFlugServiceCallback
{
    [OperationContract(IsOneWay=true)]
    void BucheFlugCallback(bool erfolg, string ticketId);
        
}

public class FlugService : IFlugService
{
    public void BucheFlug(string flugNummer, DateTime datum, string vorname, string nachname)
    {
    
        Thread.Sleep(5000); // Simuliert langen Prozess ...

        var callback = 
            OperationContext
                .Current
                .GetCallbackChannel<IFlugServiceCallback>();

        callback.BucheFlugCallback(true, "LH4711");

    }
}
Service-Konfiguration
 
<system.serviceModel>

  <services>
    <service name="Service.FlugService">
      <endpoint
            address=""
            binding="netHttpBinding"
            contract="Service.IFlugService" />
    </service>
      
  </services>

  <bindings>
    <netHttpBinding>
      <binding>
        <webSocketSettings connectionMode="Allowed" subProtocol="flights" />
        <security mode="None" />
      </binding>
    </netHttpBinding>
      
  </bindings>
    
  <behaviors>
    <serviceBehaviors>
      <behavior>
          
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
</system.serviceModel>
 
Client
 
class Program
{
    static void Main(string[] args)
    {
        var client = new FlugServiceClient(
                        new InstanceContext(
                            new FlugServiceCallback()));

        client.BucheFlug("LH4711", DateTime.Now, "Max", "Muster");

        Console.WriteLine("fertig!");
        Console.ReadLine();
    }
}
 
Client-Konfiguration
 
<system.serviceModel>
    <bindings>
        <netHttpBinding>
            <binding> 
                <webSocketSettings 
                  connectionMode="Allowed" 
                  subProtocol="flights" 
                  />
                <security mode="None" />
            </binding>
        </netHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost/Service/FlugService.svc"
            binding="netHttpBinding" contract="Proxy.IFlugService" />
    </client>
</system.serviceModel>
 
Download: Link
 

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

08.10.2011 15:39:43
BASTA: Unterlagen zum .NET 4 End-2-End-Workshop, Teil 2 (Nachmittag) #bastacon http://t.co/wclxUFLw
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

08.10.2011 14:32:33
WCF 4.5: Benachrichtigungs-Szenarien mit WebSockets (netHttpBinding) http://t.co/U4obnTpO
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

07.10.2011 06:31:08
Totgesagte leben länger: Überblick über die vielen schönen Neuheiten in .NET 4.5 und VS 11. http://t.co/0CqIr6IL
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Nachlese zur Herbst-BASTA

06.10.2011 12:34:26
Letzte Woche fand wieder die BASTA, Deutschlands größte .NET-Konferenz, in Mainz statt. Microsoft selbst war dabei nicht mit Vorträgen zu Windows 8, WinRT und .NET 4.5 vertreten.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

BASTA: Unterlagen zum .NET 4 End-2-End-Workshop (#bastacon)

30.09.2011 16:12:00

Nachfolgend die Unterlagen zum ersten Teil des End-2-End-Workshops von der Basta (der zweite Teil, der dann auch den Workflow beinhaltet folgt noch).

Part1-Vormittag.zip (963,20 kb)


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

30.09.2011 14:44:00
BASTA: Unterlagen zum .NET 4 End-2-End-Workshop (#bastacon) http://t.co/hscbHHWh
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

30.09.2011 08:04:12
#bastcon: Für alle, die mich auf Windows 8/WinRT angesprochen haben, hier noch der Link zu dem WinRT-Bericht auf Heise: http://t.co/XGKJzx5t
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

BASTA: Unterlagen zur Session über ASP.NET MVC und REST (#bastacon)

29.09.2011 17:13:00

Nachfolend findet man meine Unterlagen sowie das Beispiel der Session über ASP.NET MVC und REST. 

 

 

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

29.09.2011 15:33:41
BASTA: Unterlagen zur Session über ASP.NET MVC und REST (#bastacon) http://t.co/fMpP1uGe
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Benutzerdefinierte HTTP Authentifizierung mit ASP.NET MVC

29.09.2011 15:07:00
Natürlich, IIS selbst implementiert auch HTTP Authentifizierung. Das Problem dabei ist, dass IIS standardmäßig nur auf Windows-Benuzter/ AD-Benutzer losgeht. Möchte man dies umgehen, muss man ein benutzerdefiniertes IIS-Modul schreiben. Das ist aber nicht unbedingt wünschenswert. Zum Glück kann uns das bei ASP.NET MVC erspart bleiben. Hier bietet sich nämlich die Implementierung eines Authentifizierungsfilters an. Nachfolgend platziere ich eine Beispiel-Implementierung dazu.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Text;

namespace FlugBuchungsService.CustomAuth
{
    public class CustomHttpBasicAuthFilter: FilterAttribute, IAuthorizationFilter    {

        public void OnAuthorization(AuthorizationContext filterContext)
        {
            var context = filterContext.RequestContext.HttpContext;
            var request = context.Request;
            var response = context.Response;

            var header = request.Headers["Authorization"];

            if (string.IsNullOrEmpty(header) || !header.Trim().ToLower().StartsWith("basic"))
            {
                response.Headers["WWW-Authenticate"] = "Basic realm=\"flugservicedemo\"";
                filterContext.Result = new HttpStatusCodeResult(401, "Unauthorized");
                return;
            }

            header = header.Trim();
            header = header.Substring(5); // Basic wegschneiden ...
            header = header.Trim();
            header = Encoding.UTF8.GetString(Convert.FromBase64String(header));

            var index = header.IndexOf(:);
            if (index == -1)
            {
                response.Headers["WWW-Authenticate"] = "Basic realm=\"flugservicedemo\"";
                filterContext.Result = new HttpStatusCodeResult(401, "Unauthorized");
                return;

            }

            var user = header.Substring(0, index);
            var password = header.Substring(index + 1);

            if (user != "test" && password != "test")
            {
                response.Headers["WWW-Authenticate"] = "Basic realm=\"flugservicedemo\"";
                filterContext.Result = new HttpStatusCodeResult(403, "Forbidden");
            }

        }

        private static string RemovePrefix(string str, string prefix)
        {
            if (str.StartsWith(prefix))
            {
                str = str.Substring(prefix.Length, str.Length - prefix.Length);
            }
            return str;
        }
    }
}
Aktivieren kann man diesen Filter, indem man damit einzelne Action-Methoden annotiert registriert.
[CustomHttpBasicAuthFilter]
[UrlMapping("/fluege")]
public ActionResult Index()
{
    var rep = new Repository();

    var fluege = rep.FindFluege();

    return Json(fluege, JsonRequestBehavior.AllowGet);
}
Alternativ dazu kann man den Filter auch als globalen Filter registrieren.
// global.asax
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new CustomHttpBasicAuthFilter());
}

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

29.09.2011 13:21:37
Benutzerdefinierte HTTP Authentifizierung mit ASP.NET MVC http://t.co/J5WN2m7A
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

29.09.2011 08:27:24
Sehr informative und unterhaltsame Session über Testmanagement mit TFS von Neno Loje auf der #bastacon
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

28.09.2011 19:24:02
Hacking-Night-Schhol @ #bastacon: mit beef Browser entführen ...
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

28.09.2011 19:15:53
Tolle Hacking-Nightshool auf #bastacon: sslstrip macht mir Angst ...
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

28.09.2011 18:21:54
Stephan Walter @ #bastacon 40+% use jQuery: trends.buildwith.com
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

28.09.2011 18:19:12
Stephan Walther erwähnt Vorschlag um Ajax-Seiten SEO-freundlich zu machen #bastacon http://t.co/DOoOnwpN
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

28.09.2011 13:28:01
@Suicidal1337 Ja eh, das gemeine war, dass ich sogar nen countdown mitlaufen hatte - aber der war auf 90 min (= Zeit für Sessions am Mo) :-(
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

28.09.2011 09:49:04
... und zu Self Tracking Entities mit EF 4.1 Code Only: http://t.co/2GFcz5ou (#bastacon)
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

28.09.2011 09:47:09
Da gestern in der Session die Zeit knapp wurde: Infos zu EF 4.1 mit Oracle: http://t.co/SS1nl295 (#bastacon)
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

BASTA: Unterlagen zur Session über Entity Framework 4.1 Code Only (#bastacon)

27.09.2011 16:51:00

Nachfolgend findet man den Link zu meiner Session über Entity Framework 4.1 Code Only, welche ich heute auf der BASTA! gehalten habe.

steyer_EF4_1_CodeOnly.pdf (458,12 kb)

Weitere Infos findet man hier:

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

27.09.2011 15:43:50
BASTA: Unterlagen zur Session über Entity Framework 4.1 Code Only (#bastacon) http://t.co/gXYDPucA
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

27.09.2011 15:31:41
Info von Reiner Stropek: LoadStorm für Last-Tests #bastacon
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

27.09.2011 10:51:47
#bastacon Lästiger übersehener Tippfehler in meiner EF-Einführungssession. In dem ZIP zum Download ist es korrekt: http://t.co/bdaBn2sM
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

27.09.2011 08:12:17
@writeline Was genau habe ich "nicht gepeilt"? #bastacon
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

27.09.2011 08:10:11
#bastacon Folien und Beispiel aus dem Vortrag "ADO.NET Entity Framework 4.1 - Einführung" http://t.co/bdaBn2sM
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

27.09.2011 06:38:13
#BASTAcon Gleich Keynote zusammen mit Rainer Stropek und Christian Weyer: Zum Thema WinRT wird es heiß hergehen :-)
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

27.09.2011 06:13:26
@BASTAcon Gleich Keynote zusammen mit Rainer Stropek und Christian Weyer: Zum Thema WinRT wird es heiß hergehen :-)
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

BASTA: Unterlagen zu Scrum-Session (#bastacon)

26.09.2011 11:08:00

Nachfolgend die Folien zu meinem Vortrag zur Scrum auf der BASTA! 2011 

steyer_Scrum.pdf (404,02 kb)


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

26.09.2011 09:20:06
BASTA: Unterlagen zu Scrum-Session (#bastacon) http://t.co/NVca2Wfh
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

25.09.2011 18:04:14
Gerade in FRA gelandet. Bald dürfen wir unsere Handys einschalten ... hm ... ups. #bastacon
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

24.09.2011 11:52:26
@dotnetpro_mag Meine Data Access-Kolumne 10/2011: ADO.NET EF-Abfrage von 283.448 Datensätzen auf einer Tabelle mit 887 Mio Sätzen: 979 ms!
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Url-Mapping via Attribute in ASP.NET MVC

23.09.2011 00:37:00
Die Möglichkeit des Url-Mappings bringt in ASP.NET einige nette Möglichkeiten mit sich. Macht man davon jedoch, zum Beispiel im Zuge der Implementierung von REST-Services, intensiv Gebrauch, wirkt die Tatsache, dass das Mapping nicht im Rahmen der Action-Methoden sondern Global.asax zu hinterlegen ist, nervig. Aus diesem Grund habe ich mich diese Woche an der Implementierung eines UrlMapping-Attributes versucht. Dieses wird wie nachfolgend dargestellt verwendet:
public class FlugRessourceController : Controller
{

    [UrlMapping("/fluege/{flugId}/buchungen")]
    public ActionResult Buchungen(int flugId)
    {
        var rep = new Repository();
        var fluege = rep.FindBuchungenByFlugId(flugId);
        return Json(fluege, JsonRequestBehavior.AllowGet);
    }
}
Das Attribut an sich gestaltet sich relative einfach. 
public class UrlMappingAttribute: Attribute
{
    public UrlMappingAttribute(string url)
    {
        Url = url;
    }
 
    public String Url { get; set; }
 
}
Um es „zum Leben zu erwecken“, habe ich die nachfolgend dargestellte Erweiterungsmethode MapController<T> entwickelt. Sie nimmt den Typ eines Controllers als Typ-Parameter entgegen und erstellt dafür anhand der in den UrlMapping-Attributen enthaltenen Informationen Routen.
public static class UrlMappingRouteCollectionTools
{
    public static void MapController<T>(this RouteCollection routes) where T : IController
    {
        var controller = typeof(T);
        var methods = controller.GetMethods();
        int i = 0;
        foreach (var method in methods)
        {
            Debug.WriteLine(method.Name);
 
            var attribute = method.GetCustomAttributes(inherit: false)
                                    .Where(a => a is UrlMappingAttribute)
                                    .FirstOrDefault();
 
            if (attribute == null) continue;
 
            var urlMappingAttribute = attribute as UrlMappingAttribute;
 
            var controllerName = RemovePostfix(controller.Name, "Controller");
            var url = RemovePrefix(urlMappingAttribute.Url, "/");
            var routeName = CreateRouteName<T>(method, ++i);
            var actionName = method.Name;
 
            routes.MapRoute(
                routeName,
                url,
                new { controller = controllerName, action = actionName }
            );
        }
    }
 
    private static string RemovePostfix(string str, string postfix)
    {
        if (str.EndsWith(postfix)) {
            str = str.Substring(0, str.Length - postfix.Length);
        }
        return str;
    }
 
    private static string RemovePrefix(string str, string prefix)
    {
        if (str.StartsWith(prefix))
        {
            str = str.Substring(prefix.Length, str.Length - prefix.Length);
        }
        return str;
    }
 
    private static string CreateRouteName<T>(System.Reflection.MethodInfo m, int number) where T : IController
    {
        return typeof(T).Name + "_" + m.Name + "_autogenerated_" + number;
    }
}
Diese Methode kann man nun in der Global.asax in der Methode RegisterRoutes aufrufen und schon kommt man in den Genuss der über die Attribute definierten Routen.
public static void RegisterRoutes(RouteCollection routes)
{
 
    routes.MapController<FlugRessourceController>();
        […]
}

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

22.09.2011 23:31:31
Url-Mapping via Attribute in ASP.NET MVC http://t.co/AUWTEMev
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Mitentscheiden bei der Weiterentwicklung von .NET und Visual Studio

21.09.2011 13:10:17
Die Entwicklungsteams bei Microsoft lassen nun vermehrt die Benutzer Vorschläge für Verbesserungen und Neuerungen einbringen und darüber abstimmen.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Entity Framework 4.1 Code First und ORACLE

19.09.2011 23:24:00

Ein Vorteil von Code First ist die Tatsache, dass man recht einfach das DBMS wechseln kann. Das geht zwar ohne Code First auch, aber in diesem Fall muss das Storage Model im Entity Data Model angepasst werden. Bei Code-First-Projekten ist hingegen lediglich der Treiber auszutauschen.

Die nachfolgende Beschreibung zeigt, wie man ein Code First-Projekt auf ORACLE umstellen kann. Dazu kommen die Treiber von devart [1] zum Einsatz.

1.      devart dotConnect for Oracle von [1] herunterladen und installieren. Anmerkung: Die freie dotConnect Express-Variante unterstützt Entity Framework nicht. Zum Testen kann man die Trail-Version der Professional-Edition verwenden.

2.      Die folgenden Assemblies einbinden: DevArt.Data, DevArt.Data.Oracle, DevArt.Data.Oracle.Entity

3.      Falls keine benutzerdefinierte ConnectionFactory verwendet wird, ist nun der Connection-String in der web.config bzw. app.config anzupassen. Ansonsten muss die benutzerdefinierte ConnectionFactory analog dazu modifiziert werden.

<configuration>
  <connectionStrings>
    
    <!--
    <add name="HotelDbContext" providerName="System.Data.SqlClient" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=HotelDb;Integrated Security=True;Pooling=False;Encrypt=True" />
    -->
 
    <add 
      name="HotelDbContext" 
      connectionString="Data Source=localhost;User Id=...;Password=...;" 
      providerName="Devart.Data.Oracle"/>
    
  </connectionStrings>
</configuration>

 

4.      In einer perfekten Welt wäre das nun alles. In dieser Welt sind noch zwei Anpassungen vorzunehmen. Zum einen ist in der Context-Implementierung anzugeben, dass die ColumnTypeCasingConvention nicht anzuwenden ist, da Oracle damit nicht klar kommt.

 

public class HotelDbContext : DbContext
{
     public DbSet<Hotel> Hotels { getset; }
     public DbSet<HotelBuchung> HotelBuchungs { getset; }
     public DbSet<KontoAbbuchung> KontoAbbuchungs { getset; }
     public DbSet<KreditkartenZahlung> KreditkartenZahlungs { getset; }
     public DbSet<Region> Regions { getset; }
     public DbSet<Zahlung> Zahlungs { getset; }
     public DbSet<ZahlungBase> ZahlungBases { getset; }
 
     protected override void OnModelCreating(DbModelBuilder modelBuilder)
     {
 
              // Für ORA:
              modelBuilder.Conventions.Remove<ColumnTypeCasingConvention>();
    
                […]
     }
}

 

5.      Falls keine Schemata spezifiziert wurden, muss auf Treiber-Ebene die Verwendung dieser abschalten werden, da standardmäßig das Schema ‚dbo‘, welches unter SQL Server immer existiert, herangezogen wird.

 

static void Main(string[] args)
{
 
    Database.SetInitializer(new DropCreateDatabaseAlways<HotelDbContext>());
 
 var config = OracleEntityProviderConfig.Instance;
 config.Workarounds.IgnoreSchemaName = true;
 
 […]
}

 

Zusätzlich hat es sich bewährt, die Länge von Strings mit der FluentAPI oder den DataAnnotations zu beschränken. Macht man das nicht, werden CLOB-Spalten eingerichtet, was in den meisten Fällen nicht erwünscht sein dürfte. Das war’s dann auch schon. Wird die Anwendung nun ausgeführt, sollte Sie unter ORACLE laufen.

 

[1] http://www.devart.com/


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

19.09.2011 22:05:20
Entity Framework 4.1 Code First und ORACLE http://t.co/dAlo5Xfu
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

17.09.2011 23:15:25
Ändern der UUID einer virtuellen Festplatte für Virtual Box: VBoxManage internalcommands sethduuid xyz.vdi
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

16.09.2011 06:20:34
@derjabkin Ich hab keine News zu SL gesehen/gehoert. Aber tot würde ich es auch noch nicht nennen. In Intranets etc weiterhin zu gebrauchen.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

15.09.2011 17:27:46
@bldwin: Visual Studio /* life runs on code */ http://t.co/VlifmNVl http://t.co/VrD2j0HY
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

15.09.2011 14:06:03
#bldwin Mit Windows Runtime kehrt Microsoft zu COM, das Microsoft eigentlich in 2002 durch .NET abgelöst haben wollte http://t.co/FJdAk3Ig
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

15.09.2011 13:53:00
.NET neu erfunden in Native Code und COM - Windows Runtime Library (WinRT) - Überblick und eine kritische Wertung: http://t.co/XGKJzx5t
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Reaktivierung des klassischen Startmenüs in Windows Server "8" und Windows 8

15.09.2011 10:29:29
Microsoft ist begeistert von dem neuen, bildschirmfüllenden "Start Screen". Man kann aber zum Glück auch das "alte" Startmenü wieder aktivieren.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Previews von Windows Server 8, .NET 4.5 und Visual Studio 11

15.09.2011 08:29:29
Für MSDN-Abonennten steht ab sofort Vorabversionen des nächsten Windows Server sowie des nächsten ,NET Framework sowie Visual Studio zur Verfügung. Der Rest der Welt muss bis Freitag warten.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Windows Runtime statt .NET Framework?

14.09.2011 16:10:07
Windows Apps für die neue Windows-8-Oberfläche "Metro" programmiert man nicht mehr primär mit .NET, sondern mit der neuen Windows Runtime (WinRT). Die Verwirrung ist groß.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

14.09.2011 14:27:29
Windows Runtime statt .NET Framework? http://t.co/h07d363
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Windows 8: Anmelden am Betriebssystem mit Windows Live ID

14.09.2011 10:30:18
In Windows 8 kann man als Benutzernamen und Kennwort für die Anmeldung am PC sein Windows-Live-Konto verwenden.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

14.09.2011 09:12:45
Windows 8: Anmelden am Betriebssystem mit Windows Live ID http://t.co/eJshozs ja, "klassische" lokale Benutzerkonten gibt es auch noch :-)
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

14.09.2011 08:16:11
#bldwin Windows 8 has #powershell 3! Many new commandlets for WMI, Filesystem, Network Config, DTC, DNS, BrancheCache, iSCSI, Printer, ODBC
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

14.09.2011 06:11:57
#bldwin Windows 8 Developer Preview including developer tools http://t.co/DrHPUr2
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.09.2011 18:21:14
#bldwin "The new Windows Dev Center is launching soon" http://t.co/l8YgmtS
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.09.2011 17:09:03
#bldwin Die schlechte Nachricht: Wieder eine komplett neue Bibliothek. Warum kann WinRT nicht das gleiche API wie das .NET Framework nutzen?
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.09.2011 17:06:30
#bldwin Die gute Nachricht ist: Wir können weiterhin mit C# und XAML arbeiten, wir müssen nicht HTML und JavaScript machen!
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.09.2011 16:53:08
#bldwin "Store"-Menü in Visual Studio 11: Man kann jetzt Anwendungen direkt zum Windows 8 (und Phone 7/8?) App Store senden
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.09.2011 16:48:07
Expression Blend 5 kann "all die tollen Dinge", die es für XAML kann, nun auch für HTML #bldwin
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.09.2011 16:43:37
#bldwin Wurzelnamensräume für JavaScript-Metro-App: WinJS.Application und Windows.ApplicationModel
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.09.2011 16:42:05
#bldwin Visual Studio 11 Webeditor hat bisher nur Quellcodeansicht, keinen Designer :-(
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.09.2011 16:40:01
#bldwin Visual Studio 11 Express Windows Developer Preview
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.09.2011 16:38:03
#bldwin Windows Runtime (WinRT) soll 1800 "Objekte" haben (er meint wohl Klassen :-)
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.09.2011 16:35:38
#bldwin "Starting at 8PM today,Seattle time, you can download all of the code that attendees at BUILD received." http://t.co/cmEyBvu
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.09.2011 16:22:06
"WinRT is the core set of services... that replaces the WCF, WPF etc. layer in Windows today." http://t.co/2Dz2XhX
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.09.2011 16:17:23
#bldwin "Developers will be able to download the Windows Developer Preview via the new Windows Dev Center later this week."
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.09.2011 16:13:51
#bldwin Windows 8 soll deutlich weniger Speicher brauchen.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.09.2011 16:09:47
#bldwin Alles, was unter Windows 7 läuft, soll auch unter Windows 8 laufen. Hoffentlich :-)
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.09.2011 15:47:35
#bldwin 25 Minuten vor der Keynote begann die Live-Übertragung http://t.co/JuoAF4k
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

12.09.2011 16:42:41
@BuildWindows8 – Konferenzgeflüster: Die Spannung steigt! http://t.co/1ulSfHE #bldwin @dotnet_de
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

12.09.2011 16:41:04
@BuildWindows8 – Konferenzgeflüster: Die Spannung steigt! http://t.co/1ulSfHE
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Updates für .NET 4.0

06.09.2011 08:29:29
Inzwischen gibt es drei offizielle Erweiterungspakete für das im April 2010 erschienene .NET Framework 4.0.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

06.09.2011 08:21:07
Im DOTNET DOKTOR Blog: Überblick über die offiziellen Erweiterungspakete für .NET 4.0: http://t.co/EdOnR23
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

06.09.2011 08:19:49
Das Programm der Advanced Developers Conference 2011 in Frankenthal bei Mannheim 26.+27.10.2011 ist online: http://t.co/ddDzsUU
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

06.09.2011 08:14:56
@dotnet_de Magazin 10.2011 Rubrik ".NETversum": Optimierungen beim ADO.NET Entity Framework; Zugriff auf COM ohne PIA; Impersonation bei WCF
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Windows-Server-Administration mit der PowerShell

29.08.2011 08:29:27
Folien und Beispiele für die Anwendung der Windows PowerShell in der Serveradministration
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Self Tracking Entities mit Code Only implementieren

25.08.2011 13:48:00
// --- Wiederverwendbarer Teil --------------

public enum DetachedEntityState
{
    New, Updated, Deleted, Unchanged
}

public interface IEntity
{
    DetachedEntityState State { get; set; }
}

public static class StateTrackingHelper
{

    public static void ApplyStates<T>(this ICollection<T> entities, DbContext ctx) where T : class, IEntity 
    {
        foreach (var e in entities)
        {
            ApplyState(e, ctx);
        }
    }

    public static void ApplyState<T>(this T entity, DbContext ctx) where T : class, IEntity
    {
        switch (entity.State)
        {
            case DetachedEntityState.New:
                ctx.Entry<T>(entity).State = System.Data.EntityState.Added;
                break;
            case DetachedEntityState.Updated:
                ctx.Entry<T>(entity).State = System.Data.EntityState.Modified;
                break;
            case DetachedEntityState.Deleted:
                ctx.Entry<T>(entity).State = System.Data.EntityState.Deleted;
                break;
        }
    }

    public static ICollection<T> ResetStates<T>(this ICollection<T> entities) where T : class, IEntity
    {
        foreach (var e in entities)
        {
            ResetState(e);
        }
        return entities;
    }

    public static void ResetState<T>(this T entity) where T : class, IEntity
    {
        entity.State = DetachedEntityState.Unchanged;
    }
        
}

// --- Anwendung --------------

public class Region: IEntity
{
    public Region()
    {
        Hotels = new List<Hotel>();
        Top10Hotels = new List<Hotel>();
    }

    private int _RegionId;
    public int RegionId
    {
        get
        {
            return _RegionId;
        }
        set
        {
            if (_RegionId != value) {
                _RegionId = value;
                this.State = DetachedEntityState.Updated; 
            }
        }
    }
    private string _Bezeichnung;
    public string Bezeichnung
    {
        get
        {
            return _Bezeichnung;
        }
        set
        {
            if (_Bezeichnung != value) {
                _Bezeichnung = value;
                this.State = DetachedEntityState.Updated; 
            }
        }
    }

    private ICollection<Hotel> _Hotels;

    public virtual ICollection<Hotel> Hotels
    {
        get
        {
            return _Hotels;
        }
        set
        {
            if (_Hotels != value) {
                _Hotels = value;
                this.State = DetachedEntityState.Updated; 
            }

        }
    }
    private ICollection<Hotel> _Top10Hotels;
    public virtual ICollection<Hotel> Top10Hotels
    {
        get
        {
            return _Top10Hotels;
        }
        set
        {
            if (_Top10Hotels != value) {
                _Top10Hotels = value;
                this.State = DetachedEntityState.Updated; 
            }

                 
        }
    }

    private DetachedEntityState _State;
    [NotMapped]
    public DetachedEntityState State
    {
        get
        {
            return _State;
        }
        set
        {
            _State = value;
        }
    }
}

public class Hotel : IEntity
{
    private int _HotelId;
    public int HotelId
    {
        get
        {
            return _HotelId;
        }
        set
        {

            if (_HotelId != value) {
                _HotelId = value;
                this.State = DetachedEntityState.Updated; 
            }

            
        }
    }
    private string _Bezeichnung;
    public string Bezeichnung
    {
        get
        {
            return _Bezeichnung;
        }
        set
        {
            if (_Bezeichnung != value) {
                _Bezeichnung = value;
                this.State = DetachedEntityState.Updated; 
            }
                
        }
    }
    private int _Sterne;
    public int Sterne
    {
        get
        {
            return _Sterne;
        }
        set
        {

            if (_Sterne != value) {
                _Sterne = value;
                this.State = DetachedEntityState.Updated; 
            }
        }
    }

    private int _RegionId;
    public int RegionId
    {
        get
        {
            return _RegionId;
        }
        set
        {
            if (_RegionId != value) {
                _RegionId = value;
                this.State = DetachedEntityState.Updated; 
            }
        }
    }

    private Region _Region;
    [ForeignKey("RegionId"), InverseProperty("Hotels")]
    public virtual Region Region
    {
        get
        {
            return _Region;
        }
        set
        {
            if (_Region != value) {
                _Region = value;
                this.State = DetachedEntityState.Updated; 
            }
        }
    }

    private DetachedEntityState _State;
    [NotMapped]
    public DetachedEntityState State
    {
        get
        {
            return _State;
        }
        set
        {
            _State = value;
        }
    }
        
}

public class WellnessHotel : Hotel
{
    private int _AnzahlSaunen;
    public int AnzahlSaunen
    {
        get
        {
            return _AnzahlSaunen;
        }
        set
        {
            if (_AnzahlSaunen != value) {
                _AnzahlSaunen = value;
                this.State = DetachedEntityState.Updated; 
            }
                
        }
    }
    private int _AnzahlThermalBecken;
    public int AnzahlThermalBecken
    {
        get
        {
            return _AnzahlThermalBecken;
        }
        set
        {
            if (_AnzahlThermalBecken != value) {
                _AnzahlThermalBecken = value;
                this.State = DetachedEntityState.Updated; 
            }
        }
    }
}

public class HotelDbContext : DbContext
{
    public HotelDbContext(): base("CodeOnlyHotelDb") { } 

    public DbSet<Hotel> Hotels { get; set; }
    public DbSet<Region> Regionen { get; set; }
}

public class RegionDAO
{

    public List<Region> FindAll()
    {
        using (var ctx = new HotelDbContext())
        {
            var result = ctx.Regionen.Include("Hotels").ToList();
            result.ResetStates();
            return result;
        }

    }

    public void UpdateRegion(Region r)
    {
        using (var ctx = new HotelDbContext())
        {
            ctx.Regionen.Attach(r);

            r.ApplyState(ctx);
            r.Hotels.ApplyStates(ctx);
                
            ctx.SaveChanges();

            r.ResetState();
            r.Hotels.ResetStates();
        }
    }

    public void SaveRegion(Region r1)
    {
        using (var ctx = new HotelDbContext())
        {
            ctx.Regionen.Add(r1);
            ctx.SaveChanges();
        }
    }



}

class Program
{
    static void Main(string[] args)
    {
        Database.SetInitializer(new DropCreateDatabaseAlways<HotelDbContext>());

        CreateSaveModifySaveDemo();
        LoadShowModifySaveDemo();
        LoadShowModifySaveDemo();

        Console.WriteLine("fertig!");
        Console.ReadLine();

    }

    private static void CreateSaveModifySaveDemo()
    {
        var dao = new RegionDAO();

        Region r1 = new Region { Bezeichnung = "Graz" };
        Hotel h1 = new Hotel { Bezeichnung = "Hotel zur Post", Sterne = 2 };

        WellnessHotel h2 = new WellnessHotel
        {
            Bezeichnung = "Hotel zur Wellness",
            Sterne = 4,
            AnzahlSaunen = 3,
            AnzahlThermalBecken = 4
        };

        r1.Hotels.Add(h1);
        r1.Hotels.Add(h2);
        r1.Top10Hotels.Add(h2);

        dao.SaveRegion(r1);

        h2.Sterne++;
        r1.Bezeichnung += "!"; // kleine Änderung

        dao.UpdateRegion(r1);
    }

    private static void LoadShowModifySaveDemo()
    {
        var dao = new RegionDAO();

        var regionen = dao.FindAll();
        foreach (var r in regionen)
        {
            Console.WriteLine(r.Bezeichnung);
            r.Bezeichnung += "$"; // kleine Änderung
            int i = 0;
            foreach (var h in r.Hotels)
            {
                Console.WriteLine("    " + h.Bezeichnung + ", Sterne: " + h.Sterne);
                if (i++ % 2 == 0) h.Bezeichnung += "$"; // kleine Änderung
            }
            Console.WriteLine();
            dao.UpdateRegion(r);
        }
            
    }

}

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Self Tracking Entities auf der Basis von Code Only in EF 4.1+

25.08.2011 13:38:00

EF 4.1 bringt mit Code Only einige nette Möglichkeiten, die über den Code First-Ansatz hinausgehen. Doch leider muss man sich derzeit für eine der von EF bereitgestellten Spielarten entscheiden. Das bedeutet mitunter, dass man zwischen Code Only und Self Tracking-Entities entscheiden muss.

Was aber, wenn man Code Only in verteilten Umgebungen einsetzen möchte?

In diesem Fall wäre es wünschenswert, die Vorteile dieser beiden Ansätze zu verbinden. Das nachfolgende Beispiel demonstriert deswegen, wie mittels Code Only Entitäten mit den Eigenschaften von Self Tracking-Entities implementiert werden können. Der erste Teil beinhaltet ein paar allgemine Hilfskonstrukte; der zweite Teil zeigt anhand eines Beispiels, wie man diese einsetzt.

// --- Wiederverwendbarer Teil --------------

public enum DetachedEntityState
{
    New, Updated, Deleted, Unchanged
}

public interface IEntity
{
    DetachedEntityState State { get; set; }
}

public static class StateTrackingHelper
{

    public static void ApplyStates<T>(this ICollection<T> entities, DbContext ctx) where T : class, IEntity 
    {
        foreach (var e in entities)
        {
            ApplyState(e, ctx);
        }
    }

    public static void ApplyState<T>(this T entity, DbContext ctx) where T : class, IEntity
    {
        switch (entity.State)
        {
            case DetachedEntityState.New:
                ctx.Entry<T>(entity).State = System.Data.EntityState.Added;
                break;
            case DetachedEntityState.Updated:
                ctx.Entry<T>(entity).State = System.Data.EntityState.Modified;
                break;
            case DetachedEntityState.Deleted:
                ctx.Entry<T>(entity).State = System.Data.EntityState.Deleted;
                break;
        }
    }

    public static ICollection<T> ResetStates<T>(this ICollection<T> entities) where T : class, IEntity
    {
        foreach (var e in entities)
        {
            ResetState(e);
        }
        return entities;
    }

    public static void ResetState<T>(this T entity) where T : class, IEntity
    {
        entity.State = DetachedEntityState.Unchanged;
    }
        
}

// --- Anwendung --------------

public class Region: IEntity
{
    public Region()
    {
        Hotels = new List<Hotel>();
        Top10Hotels = new List<Hotel>();
    }

    private int _RegionId;
    public int RegionId
    {
        get
        {
            return _RegionId;
        }
        set
        {
            if (_RegionId != value) {
                _RegionId = value;
                this.State = DetachedEntityState.Updated; 
            }
        }
    }
    private string _Bezeichnung;
    public string Bezeichnung
    {
        get
        {
            return _Bezeichnung;
        }
        set
        {
            if (_Bezeichnung != value) {
                _Bezeichnung = value;
                this.State = DetachedEntityState.Updated; 
            }
        }
    }

    private ICollection<Hotel> _Hotels;

    public virtual ICollection<Hotel> Hotels
    {
        get
        {
            return _Hotels;
        }
        set
        {
            if (_Hotels != value) {
                _Hotels = value;
                this.State = DetachedEntityState.Updated; 
            }

        }
    }
    private ICollection<Hotel> _Top10Hotels;
    public virtual ICollection<Hotel> Top10Hotels
    {
        get
        {
            return _Top10Hotels;
        }
        set
        {
            if (_Top10Hotels != value) {
                _Top10Hotels = value;
                this.State = DetachedEntityState.Updated; 
            }

                 
        }
    }

    private DetachedEntityState _State;
    [NotMapped]
    public DetachedEntityState State
    {
        get
        {
            return _State;
        }
        set
        {
            _State = value;
        }
    }
}

public class Hotel : IEntity
{
    private int _HotelId;
    public int HotelId
    {
        get
        {
            return _HotelId;
        }
        set
        {

            if (_HotelId != value) {
                _HotelId = value;
                this.State = DetachedEntityState.Updated; 
            }

            
        }
    }
    private string _Bezeichnung;
    public string Bezeichnung
    {
        get
        {
            return _Bezeichnung;
        }
        set
        {
            if (_Bezeichnung != value) {
                _Bezeichnung = value;
                this.State = DetachedEntityState.Updated; 
            }
                
        }
    }
    private int _Sterne;
    public int Sterne
    {
        get
        {
            return _Sterne;
        }
        set
        {

            if (_Sterne != value) {
                _Sterne = value;
                this.State = DetachedEntityState.Updated; 
            }
        }
    }

    private int _RegionId;
    public int RegionId
    {
        get
        {
            return _RegionId;
        }
        set
        {
            if (_RegionId != value) {
                _RegionId = value;
                this.State = DetachedEntityState.Updated; 
            }
        }
    }

    private Region _Region;
    [ForeignKey("RegionId"), InverseProperty("Hotels")]
    public virtual Region Region
    {
        get
        {
            return _Region;
        }
        set
        {
            if (_Region != value) {
                _Region = value;
                this.State = DetachedEntityState.Updated; 
            }
        }
    }

    private DetachedEntityState _State;
    [NotMapped]
    public DetachedEntityState State
    {
        get
        {
            return _State;
        }
        set
        {
            _State = value;
        }
    }
        
}

public class WellnessHotel : Hotel
{
    private int _AnzahlSaunen;
    public int AnzahlSaunen
    {
        get
        {
            return _AnzahlSaunen;
        }
        set
        {
            if (_AnzahlSaunen != value) {
                _AnzahlSaunen = value;
                this.State = DetachedEntityState.Updated; 
            }
                
        }
    }
    private int _AnzahlThermalBecken;
    public int AnzahlThermalBecken
    {
        get
        {
            return _AnzahlThermalBecken;
        }
        set
        {
            if (_AnzahlThermalBecken != value) {
                _AnzahlThermalBecken = value;
                this.State = DetachedEntityState.Updated; 
            }
        }
    }
}

public class HotelDbContext : DbContext
{
    public HotelDbContext(): base("CodeOnlyHotelDb") { } // .\SQLEXPRESS

    public DbSet<Hotel> Hotels { get; set; }
    public DbSet<Region> Regionen { get; set; }
}

public class RegionDAO
{

    public List<Region> FindAll()
    {
        using (var ctx = new HotelDbContext())
        {
            var result = ctx.Regionen.Include("Hotels").ToList();
            result.ResetStates();
            return result;
        }

    }

    public void UpdateRegion(Region r)
    {
        using (var ctx = new HotelDbContext())
        {
            ctx.Regionen.Attach(r);

            r.ApplyState(ctx);
            r.Hotels.ApplyStates(ctx);
                
            ctx.SaveChanges();

            r.ResetState();
            r.Hotels.ResetStates();
        }
    }

    public void SaveRegion(Region r1)
    {
        using (var ctx = new HotelDbContext())
        {
            ctx.Regionen.Add(r1);
            ctx.SaveChanges();
        }
    }



}

class Program
{
    static void Main(string[] args)
    {
        Database.SetInitializer(new DropCreateDatabaseAlways<HotelDbContext>());

        CreateSaveModifySaveDemo();
        LoadShowModifySaveDemo();
        LoadShowModifySaveDemo();

        Console.WriteLine("fertig!");
        Console.ReadLine();

    }

    private static void CreateSaveModifySaveDemo()
    {
        var dao = new RegionDAO();

        Region r1 = new Region { Bezeichnung = "Graz" };
        Hotel h1 = new Hotel { Bezeichnung = "Hotel zur Post", Sterne = 2 };

        WellnessHotel h2 = new WellnessHotel
        {
            Bezeichnung = "Hotel zur Wellness",
            Sterne = 4,
            AnzahlSaunen = 3,
            AnzahlThermalBecken = 4
        };

        r1.Hotels.Add(h1);
        r1.Hotels.Add(h2);
        r1.Top10Hotels.Add(h2);

        dao.SaveRegion(r1);

        h2.Sterne++;
        r1.Bezeichnung += "!"; // kleine Änderung

        dao.UpdateRegion(r1);
    }

    private static void LoadShowModifySaveDemo()
    {
        var dao = new RegionDAO();

        var regionen = dao.FindAll();
        foreach (var r in regionen)
        {
            Console.WriteLine(r.Bezeichnung);
            r.Bezeichnung += "$"; // kleine Änderung
            int i = 0;
            foreach (var h in r.Hotels)
            {
                Console.WriteLine("\t" + h.Bezeichnung + ", Sterne: " + h.Sterne);
                if (i++ % 2 == 0) h.Bezeichnung += "$"; // kleine Änderung
            }
            Console.WriteLine();
            dao.UpdateRegion(r);
        }
            
    }

}


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

25.08.2011 12:13:00
Self Tracking Entities mit Code Only implementieren http://t.co/ROIkK7w
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

20.08.2011 17:30:04
Mein PowerShell-Vortrag auf der #ICE11 hat den Raum "gesprengt". Vielen Dank für das große Interesse! Folien und Demos: http://t.co/i2BthG9
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

17.08.2011 07:25:57
Neue Rubik im @dotnet_de Magazin: ".NETversum - Tripps & Tricks rund um .NET" von www.IT-Visions.de-Experten (@ManfredSteyer @DOTNETDOKTOR)
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

15.08.2011 11:53:24
Meine Datenzugriffskolumne in @dotnetpro 9/2011: ADO.NET Entity Framework in verteilten Systemen, Seite 100 bis 103 www.dotnetpro.de
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

I like partially

14.08.2011 10:54:33
Was kann uns ein Mentalist über Facebook sagen? Nun, sehr viel wie es scheint.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

AppFabric June CTP räumt die Platte voll

10.08.2011 16:38:00

Bei jedem Deployment legt AppFabric June CTP einige temporäre Dateien, welche gemeinsam schon einige hundert MB groß sein können. Diese Dateien findet man unter dem versteckten Ordner C:\Users\USERNAME\AppData\Local\dftmp, wo sie darauf warten gelöscht zu werden.


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

10.08.2011 15:02:38
AppFabric June CTP räumt die Platte voll http://bit.ly/oPf8AU
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

10.08.2011 14:45:02
Azure AppFabric June CTP schreibt riesige temp. Dateien nach C:\Users\USERNAME\AppData\Local\dftmp --&gt; Müssen manuell gelöscht werden ...
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

AppFabric June CTP: Startprobleme meistern

08.08.2011 21:57:00

Der Traum eines modernen Applikations-Servers für die Windows bzw. Windows Azure-Plattform rückt mit der June CTP von Azure AppFabric ein Stück näher, zumal in dieser Vorab-Version erstmals der Applikations-Manager enthalten ist. Damit lassen sich Applikationen konfigurieren und überwachen. Vorallem für die Konfiguration von mehrschichtigen Applikationen gibt es ein paar nette Ideen, welche die Verwaltung drastisch vereinfachen dürften.

Leider ist die CTP nicht ganz unproblematisch. Nachdem ich eine in VS 2010 erstellte AppFabric-Applikation mit CTRL-F5 gestartet hat, ist zunächst nicht viel passiert. Um die Applikation in Aktion zu sehen, bin ich wie folgt vorgegangen:

  1. Applikation mit CTRL-F5 ausführen
  2. In den IIS-Manager wechseln.
  3. Web-Site, die zur Laufzeit für die aktuelle Ausführung der Applikation erstellt wurde, auswählen (Sie trägt den Namen des Projekts in sich).

  4. Herausfinden, unter welchem Port die Site läuft (Rechtsklick | Bindungen bearbeiten).
  5. Herausfinden, unter welchen (dynamisch erzeugten App-Pool) die Applikation ausgeführt wird (Rechtsklick | Website verwalten | Erweiterte Einstellungen).
  6. App-Pool unter Anwendungspool auswählen und dessen Benutzer auf ein Konto setzen, welches die für die Applikation nötigen Rechte hat (Rechtsklick auf Pool | Erweiterte Einstellungen | Konto unter Identität festlegen).
  7. App-Pool neu starten
  8. Applikation neu starten
  9. Applikation unter Verwendung der zuvor ermittelten Portnummer im Browser öffnen. Die URL lautet auf http://localhost:PORT/Webprojekt; Im betrachteten Fall ist dies http://localhost:PORT/Web1

 

 

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

08.08.2011 20:19:56
AppFabric June CTP: Startprobleme meistern http://bit.ly/oMV1Av
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

06.08.2011 23:04:48
"@WindowsAzure: MSDN Blog: Windows #Azure Storage Logging: Using Logs to Track Storage Requests http://t.co/Ta7uYF0";
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

04.08.2011 20:14:44
PowerShell-Tipp: Windows-Update-Einstellungen per Skript ändern. http://t.co/zmg6Rkw
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

PowerShell-Tipp: Windows-Update-Einstellungen per Skript ändern

04.08.2011 15:05:15
Mit einem kurzen PowerShell-Skript kann man die Einstellungen für Windows-Update verändern.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

03.08.2011 11:34:06
@K_Grasmann ich schätzte, ich werd mir wieder die Webcasts dazu ansehen ...
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

29.07.2011 16:28:21
Visual Studio LightSwitch ist erschienen. http://t.co/zGLY3vm kostet 245 Euro, wenn man kein MSDN-Abo hat.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Visual Studio LightSwitch ist erschienen

29.07.2011 13:35:08
Microsoft verkauft nun die Version 1.0 des RAD-Werkzeugs LightSwitch zum Einführungspreis von 245 Euro.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Vortrag "WCF futures" auf Scandev on Tour in Stockholm (Schweden)

27.07.2011 10:23:00

Im Oktober gehts wieder auf nach Schweden, wo ich in Stockholm auf der Scandev on Tour über die Neuerungen in WCF vNext und WCF RIA Services vNext plaudern werde.

Weitere Infos findet man unter [1].

 [1] http://www.scandevtour.se/2011-tour/

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Agile Day auf BASTA! (September 2011, Mainz)

27.07.2011 10:06:00

Wie schon in den Jahren zuvor bin ich auch dieses Jahr für den Agile Day auf der BASTA!, der größten unabhängigen deutschsprachigen .NET Konferenz, verantwortlich. Nachfolgend die Agenda dazu:

  • Crashkurs für Scrum Master
    Manfred Steyer FH CAMPUS 02 | www.IT-Visions.de
  • Agiles Projektmanagement mit Kanban
    Christoph Seck cluster sysko GmbH
  • Scrum @ bbv Software Services AG
    Urs Enzler bbv Software Services AG
  • Die Teststrategie komplexer Softwaresysteme in der Praxis
    Frank Düsterbeck HEC GmbH

Weitere Infos findet man unter [1].

[1] http://basta.net/2011/

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

BASTA 2011 in Mainz

27.07.2011 09:56:00

Im September findet in Mainz wieder die BASTA!, die größte unabhängige deutschsprachige .NET-Konferenz statt. Diesesmal habe ich die Ehre, mich mit den folgenden Sessions/ Workshops einbringen zu dürfen:

  • ADO.NET Entity Framework 4.1
  • REST mit MVC
  • Crashkurs für Scrum Master
  • End-to-End: eine komplette .NET-Anwendung in einem Tag 

Besonders frue ich mich auf den Workshop "End-to-End: eine komplette .NET-Anwendung in einem Tag" am FR, in dem ich gemeinsam mit meinen IT-Visions-Kollegen Holger Schwichtenberg und Joachim Fuchs zeigen werde, wie man die vielen Tools und Frameworks von .NET 4, wie zum Beispiel Entity Framework, WCF, WPF und ASP.NET MVC, in Kombination zur Entwicklung moderner verteilter Applikationen nutzen kann.

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Artikel: WCF vNext

27.07.2011 09:52:00

Die kommende Version von WCF, welche Gerüchten zu Folge 4.5 heißen wird, bringt einige Neuerungen in Sachen REST. So soll es zum Beispiel einfach möglich sein, Formate jenseits von XML und JSON via REST zu verwenden. Für AJAX-basierte Clients gibt es auch Unterstützung.

Mein Artikel im .NET Magazin 7.2011 informiert über die voraussichtlichen Möglichkeiten anhand der aktuellen Preview-Version.

http://it-republik.de/dotnet/dotnet-magazin-ausgaben/Office-365-000452.html


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

27.07.2011 08:56:13
Vortrag "WCF futures" auf Scandev on Tour in Stockholm (Schweden) http://bit.ly/oFUmoy
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

27.07.2011 08:23:07
BASTA 2011 in Mainz http://bit.ly/r4WD9s
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

27.07.2011 08:23:07
Agile Day auf BASTA! (September 2011, Mainz) http://bit.ly/n4aa1Z
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

27.07.2011 08:23:06
Artikel: WCF vNext http://bit.ly/qCGbmK
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Google+: noch ein soziales Netzwerk oder ein Versionssprung des gesellschaftlichen Betriebssystems

27.07.2011 07:34:31
Vielleicht wünscht und erträumt sich Bernd Oestereich nur diese neue Welt, aber möglicherweise ist Google+ wirklich der Wendepunkt zu etwas zivilisatorisch Neuem.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Entity Data Model considered harmful: Warum Entity Framework 4.1 Code First selbst in DB-First-Szenarien die bessere Wahl ist (Teil 1 von 6)

24.07.2011 18:05:00

Ein konzeptionelles Problem des Entity Frameworks ist das explizite Entity Data Model (EDM). Klar, irgendwo muss beschrieben werden, was wie zu mappen ist. Aber das explizite EDM ist redundant: Entitätsklassen müssen zum einen entwickelt und zum anderen im EDM, genauer gesagt im CSDL-Teil, beschrieben werden. Dasselbe gilt für DB-Strukturen und die Beschreibung im SSDL-Teil des EDM. Wenn sich irgendwo etwas ändert, muss das an den anderen Stellen nachgezogen werden. Das ist aber nicht das einzige Problem:

1.      Ab einer gewissen Anzahl an Entitäten wird die graphische Darstellung des EDM unübersichtlich. Normalerweise würde man nun das Modell auf verschiedene Submodelle aufteilen, aber das ist nicht ohne weiteres möglich, zumal man nicht auf Tabellen in anderen Modellen referenzieren kann.

2.      Das Modell kann nicht einfach modularisiert werden.  Der Grund dafür ist derselbe, wie beim letzten Punkt: Man kann Modelle nicht sinnvoll aufteilen.

3.      Kommen wir zum letzten Punkt: Wechsel der Datenbank. Dies ist ja eines der großen Versprechen von O/R-Mappern. Möchte man das eingesetzte DBMS wechseln, muss man für das neue DBMS ein erneutes SSDL generieren lassen und dieses gemeinsam mit den existierenden MDL-Teil und CSDL-Teil verwenden.

Bei (N)Hibernate gibt es diese Probleme eigentlich nicht. Der Grund dafür ist, dass lediglich die Mapping-Aspekte zu beschreiben sind – und das auf eine, im Vergleich zu den XML-Untiefen des EDM, ziemlich übersichtliche Art. Alles andere leitet das Framework aus den bestehenden Klassen ab.

Glücklicherweise ist dies seit Entity Framework 4.1 mit dem Code-First-Ansatz nun auch möglich. Dieser suggeriert zwar, dass man zuerst die Entitäten modellieren muss und dann daraus eine Datenbank zu erstellen ist, aber dank der Möglichkeit von Codegenerierung ist dies nicht der Fall. So bietet zum Beispiel die Entity Framework Power Tools CTP1, welche über den Extension Manager von VS 2010 bezogen werden können, diese Möglichkeit.


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

24.07.2011 17:42:57
Entity Data Model considered harmful: Warum Entity Framework 4.1 Code First selbst in DB-First-Szenarien die bes... http://bit.ly/qhH6Zq
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Azure AppFabric Topics und WCF

19.07.2011 13:44:00

 Mit der Mai CTP von Azure AppFabric [1] stellt Microsoft erstmals eine Implementierung von Topics zur Verfügung – wenn auch vorerst lediglich über die Azure-Cloud. Über ein REST-Interface oder einen .NET-Wrapper können damit Nachrichten an Abonnenten versendet werden. Darüber hinaus besteht auch die Möglichkeit, Topics direkt über WCF zu verwenden. Bei solchen Szenarien nehmen WCF-Services die Rolle der Abonnenten ein und WCF-Clients die Rolle des Verlegers.

Das nachfolgende Beispiel demonstriert dies. Dazu kommt ein Topic FlugBuchungenTopic mit zwei Abonnenten zum Einsatz: Accounting und BonusMilesManager. Letzterer weist auch einen Filter auf. Dieser schließt Flugbuchungen, die nicht von Vielfliegern stammen, aus. Die zum Filtern benötigten Daten müssen allerdings zusätzlich in Form von Nachrichteneigenschaften übertragen werden. Deswegen kommt beim Senden der OperationContext zum Einsatz, um diese Metadaten als Teil einer Instanz von BrokeredMessageProperty zu hinterlegen. Die Service-Operation ruft am Begin diese Instanz, welche in der Auflistung IncomingMessageProperties zu finden sind, ab.

private void CreateIfNotExist(string suffix)
{
    SharedSecretCredential myManagementCredentials =
        TransportClientCredentialBase.CreateSharedSecretCredential(IssuerName, IssuerKey);

    ServiceBusNamespaceClient namespaceClient = new ServiceBusNamespaceClient(
        ServiceBusEnvironment.CreateServiceUri("sb", ServiceNamespace, string.Empty),
        myManagementCredentials);

    string topicName = "FlugBuchungenTopic" + suffix;

    Topic myTopic;
    myTopic = namespaceClient.GetTopics().FirstOrDefault(t => t.Path == topicName.ToLower());
    if (myTopic == null)
    {
        myTopic = namespaceClient.CreateTopic(topicName.ToLower());
    }

    var subs = myTopic.GetSubscriptions();
    if (subs.Count(s => s.Name == "Accounting".ToLower()) == 0)
    {
        SubscriptionDescription desc;
        desc = new SubscriptionDescription();
        desc.EnableDeadLetteringOnMessageExpiration = true;
                
        RuleDescription ruleDesc;
        ruleDesc = new RuleDescription();
        ruleDesc.FilterExpression = new SqlFilterExpression("IstVielFlieger = True");
        ruleDesc.FilterAction = new SqlFilterAction("set PremiumKunde = True");
                
                
        var acc = myTopic.AddSubscription("Accounting".ToLower(), desc /*, ruleDesc*/);

    }

    if (subs.Count(s => s.Name == "BonusMilesManager".ToLower()) == 0)
    {
        SubscriptionDescription desc;
        desc = new SubscriptionDescription();
        desc.EnableDeadLetteringOnMessageExpiration = true;

        var filter = new SqlFilterExpression("IstVielFlieger = True");

        myTopic.AddSubscription("BonusMilesManager".ToLower(), desc, filter);
    }

}

[ServiceContract()]
public interface IFlugBuchungService
{
    [OperationContract(IsOneWay = true)]
    void Buche(FlugBuchung b);
}

 

 

 

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

19.07.2011 11:56:10
Azure AppFabric Topics und WCF http://bit.ly/pPh2tM
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

18.07.2011 08:44:39
Mein neues Buch, zusammen mit @ManfredSteyer: WCF 4.0, WF, WIF, EF STE, AppFabric, Azure. http://t.co/sldB70H Amazon: http://t.co/yaBXeX9
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

12.07.2011 15:17:06
@norberteder Die UG von Hans Grabner in Graz gibts schon noch. Zur Zeit ist Sommerpause; im Herbst gehts dann weiter ...
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Neues Buch zum Programmieren mit WCF 4.0

11.07.2011 08:24:15
Das Buch behandelt nicht nur die Entwicklung verteilter Systeme und Services in .NET 4.0 mit WCF, sondern auch das Zusammenspiel mit Techniken wie WF, WIF, EF, IIS/AppFabric und Windows Azure.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Gibt es ein Leben ohne E-Mails?

10.07.2011 17:09:19
Es ist jetzt nicht so, dass ich mir das nicht vorstellen könnte. Dazu bin ich schon zu alt...
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

07.07.2011 23:31:40
Blog: Visual Studio LightSwitch erscheint 26. Juli. http://t.co/wh15IIQ. Der Preis soll für niemanden ein Kaufhindernis darstellen.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Visual Studio LightSwitch erscheint am 26. Juli

04.07.2011 12:49:42
Microsoft neues Werkzeug für das Rapid Application Development Visual Studio LightSwitch ist ab Ende des Monats verfügbar.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Die Zukunft von WCF RIA Services ist jQuery

26.06.2011 18:23:00
Zugegeben, diese Überschrift wirkt ein wenig provokant und wie Salz in der Wunde von Silverlight-Fans, die nun - nachdem Microsoft verkündet hat, dass die von Phone 7 bekannten Tiles in Windows 8 auf HTML 5 und JavaScript basieren werden - wieder ein wenig mehr schmerzt. Trotzdem kann man nicht leugnen, dass HTML 5 und JavaScript in einer Zeit, in denen Web-Angebote immer mehr von verschiedenstenden Endgeräten jenseits des klassischen Windows-PCs genutzt werden, eine wichtige Rolle spielen. Somit verwundert es auch nicht, dass sich in der aktuellen Preview der kommenden Version von WCF RIA Services [1] alles um diese Technologien dreht.
 
Das nachfolgende Beispiel gibt einen kurzen Vorgeschmack darauf, indem es zeigt, wie mit dieser Preview, die kurz RIA/JS genannt wird, mittels jQuery ein Domain-Service konsumiert werden kann. Die dazu nötigen jQuery-Plugins findet man im Beispiel unter [1], welches auf der letzten MIX präsentiert wurde. Hierbei ist zu beachten, dass auch das jQuery-Template-Plugin, das Microsoft der Community zur Verfügung gestellt hat, darin verwendet wird.
<html>
    [...]
    
    <script src="..." ...></script>
    <!-- Plugins: siehe Samples unter [1] -->

    <script language="javascript">


    var hamster = [];
    var ds;
    var list;

    $(function () {


        ds = $([hamster]).dataSource({
            serviceUrl: "FlugSample-HamsterDomainService.svc",
            queryName: "GetHamster",
            bufferChanges: true,
            /* Änderungen können retourgesendet werden */

            refresh: function () {
                /* Refresh wird nach dem Laden der Daten aufgerufen */

                /* Template auf jeden geladenen Hamster anwenden */
                list = new ListControl(hamster, {
                    template: "#hamsterTemplate",
                    container: "#hamster"
                });
            },

            queryParameters: { farbe: "gold" }
            /* Mappt auf Parameter der Operation GetHamster */
        });


        // IQueryable um Sortierausdruck erweitern
        var sort = { property: "Spitzname", direction: "ascending" };
        ds.option("sort", sort);

        // IQueryable um Filterausdruck erweitern
        var filter = {
            property: "Spitzname",
            operator: "StartsWith",
            value: "Krümel"
        };

        ds.option("filter", filter);

        // Daten abrufen, ins Array hamster laden und render aufrufen
        ds.refresh();

    });

 

</script>

<script id="hamsterTemplate" type="text/x-jquery-tmpl">
  <li>
    ${Spitzname}, Farbe: ${Farbe}
  </li>    
</script>
</head>

<body>
    <h1>Hamster on demand</h1>

    <ul id="hamster">
    </ul>

</body>
</html>
 
 

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

26.06.2011 17:22:26
Die Zukunft von WCF RIA Services ist jQuery http://bit.ly/mCSuc2
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

23.06.2011 05:51:57
Azure AppFabric June CTP ist da: Monitoring von Services und Workflows, Composition Model etc.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

22.06.2011 18:57:24
RT: after July 1, 2011, all inbound data transfers for both peak and off-peak times will be free. http://t.co/WIwdLzR
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

22.06.2011 11:15:14
FTP mit Azure: http://mayur.gondaliya.com/microsoft/creating-ftp-server-on-windows-azure-493.html
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

21.06.2011 10:22:51
Azure AppFabric is a middle-ware solution in the cloud that isnt limited to .net but can used with JAVA, RUBY, PHP, REST (#Jazoon)
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

21.06.2011 10:20:27
just arrived at #Jazoon in Zürich. Looking forward to my session about Azure AppFabric at 14:00 in Arena 7.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Hilfe beim Fehler "The Print Spooler service terminated unexpectedly."

19.06.2011 20:54:23
Wenn der Print Spooler-Dienst in Windows nicht mehr starten will, hilft es, die installierten Drucker in der Registry zu löschen.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

18.06.2011 09:17:59
WCF: Nachrichtenbasierte Sicherheit mit Zertifikaten OHNE Certificate Store http://bit.ly/m1ubXE
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

WCF: Nachrichtenbasierte Sicherheit mit Zertifikaten OHNE Certificate Store

18.06.2011 01:00:00
Eines vorweg: Der richtige Ort zum Speichern von Zertifikaten ist der Certificate Store. Wenn das, aus welchen Gründen auch immer, problematisch ist, kann man das Zertifikat bzw. den privaten Schlüssel auch manuell laden und WCF übergeben. Die nachfolgenden Notizen beschreiben dies, indem gezeigt wird, wie man eine Applikation, die sich auf den Certificate Store abstützt, auf eine Verwendug ohne Certificate Store umstellen kann.
 
1. Privaten Schlüssel aus Cert-Store exportieren. Damit dies möglich ist, muss der Schlüssel beim Importieren in den Certificate Store als "exportierbar" markiert werden.
  
2. Benutzerdefinierte ServiceHostFactory erstellen (siehe unten)
  
3. ServiceHostFactory in .svc-Datei angeben:
<%@ ServiceHost Language="C#" Debug="true" Service="FlugService.FlugService" Factory="FlugService.CustomFactory" CodeBehind="FlugService.svc.cs" %>
 4. Validierung gegen Cert-Store am Client abschalten:
[...]

c.ClientCredentials.UserName.UserName = "soa";
c.ClientCredentials.UserName.Password = "geheim";
c.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;

[...]
 5. Validierung gegen das Zertifikat erfolgt über <identity>-Tag in Client-Konfig:
<identity>
       <certificate encodedValue="..." />
</identity>
Nachfolgend noch der Quellcode für  die benutzerdefinierte ServiceHostFactory:
using System.Web;
using System.ServiceModel.Activation;
using System.ServiceModel.Description;
using System.Security.Cryptography.X509Certificates;

namespace FlugService
{
    public class CustomFactory : ServiceHostFactory
    {
        protected override System.ServiceModel.ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {
            var sh = base.CreateServiceHost(serviceType, baseAddresses);

            ServiceCredentials sc = (ServiceCredentials)sh.Description.Behaviors.Where(b => b is ServiceCredentials).FirstOrDefault();
            
            if (sc == null)
            {
                throw new Exception("ServiceCredentials erwartet!");
            }

	        // Cert inkl. privaten Schlüssel laden 
            sc.ServiceCertificate.Certificate = new X509Certificate2(@"c:\temp\test\my.pfx", "P@ssw0rd");

            return sh;
        }
    }
}
  

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

14.06.2011 14:21:25
Beispiele zur kommenden WCF-Version. Es wird RESTful ... http://t.co/pmvB4Da
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

14.06.2011 11:29:48
Blog: Eigene T4-Vorlagen in den ADO.NET Entity Framework Designer einbinden als ADONETArtifactGenerator: http://t.co/ZqrRJ4p
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tipp: Eigene T4-Vorlagen in den ADO.NET Entity Framework Designer einbinden

14.06.2011 07:44:21
Selbsterstellte T4-Code-Gnerierungsvorlagen kann man mit einem Trick im Dialog "Add Code Generation Item" im Kontextmenü des EF-Designers nutzbar machen.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.06.2011 08:26:40
Meine Datenzugriffskolumne in @dotnetpro 7/2011: DbContext als Alternative zu ObjectContext in ADO.NET Entity Framework 4.1, ab Seite 114
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Vorschau auf die kommende Version von WCF (inkl. Beispiele)

12.06.2011 17:53:00

REST wird gerne als Alternative zu SOAP-basierten Web Services eingesetzt. Dabei wird HTTP direkt, ohne zusätzliche Protokolle, zur Kommunikation mit Services verwendet. Mit dem WCF Web API, welches Teil der nächsten WCF-Version sein soll, wird die Unterstützung für solche Szenarien ausgebaut. Die aktuelle Preview-Version [1] gibt einen Vorgeschmack auf die zu erwartenden Möglichkeiten.

Im aktuellen .NET Magazin [2] beschreibe ich einige der neuen Möglichkeiten. Meine Beispiele dazu können ebenfalls unter [2] heruntergeladen werden.

[1] http://wcf.codeplex.com

[2] http://it-republik.de/dotnet/dotnet-magazin-ausgaben/Office-365-000452.html

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

12.06.2011 16:36:22
Vorschau auf die kommende Version von WCF (inkl. Beispiele) http://bit.ly/m6xGhg
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

11.06.2011 20:51:00
RT @WindowsAzure How to Deploy Windows #Azure Role Pre-Requisite Components from Blob Storage http://bit.ly/jusBQI
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

10.06.2011 14:15:56
Wieder eine Teilnahme an der @BASTACon (27.9.2011 bis 29.9.2011 in Mainz) zu gewinnen: http://www.it-visions.de/LESER/Gewinnspiel.aspx
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

07.06.2011 15:29:18
Blog: Erich Gamma zu Microsoft. http://heise.de/-1256167. Heute habe ich das schon als Argument für VS ALM/TFS bei einem Kunden verwendet:-)
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

07.06.2011 15:26:27
Blog: BUILD-Konferenz anstelle der Microsoft PDC 2011, 13. bis 16. September in Anaheim, Kalifornien: http://heise.de/-1255674
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Erich Gamma wechselt zu Microsoft

07.06.2011 11:19:27
Erich Gamma, einer der bekanntesten Softwareentwickler der Welt, wechselt von IBM zu Microsoft ins Visual-Studio-Team.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

BUILD-Konferenz anstelle der Microsoft PDC 2011

07.06.2011 07:44:15
Microsoft nennt seine diesjährige große Entwicklerkonferenz in den USA nicht PDC, sondern BUILD. Sie findet vom 13. bis 16. September in Anaheim, Kalifornien, statt.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

05.06.2011 14:03:05
Mein ASP.NET 4.0-Entwicklerhandbuch (MSPress) ist am 17.5.11 erschienen: http://www.it-visions.de/buecher/A4C. Amazon: http://amzn.to/lFPFKE
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Episode 30: Product Line Engineering

03.06.2011 12:04:17
Eine Episode über Product Line Engineering, welche Vorteile und Nachteile sich daraus ergeben, und wie man zu einer Produktlinie kommt.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

ASP.NET-4.0-Entwicklerhandbuch erschienen

29.05.2011 15:54:21
Bei Microsoft Press gibt es nun das ASP.NET-Entwicklerhandbuch in der aktualisierten Fassung für ASP.NET 4.0 und Visual Studio 2010 mit Service Pack 1.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

WCF und Port-Sharing bei netTcpBinding

28.05.2011 15:15:00
Bei der Entwicklung von Produkten erscheint es wünschenswert, die Anzahl der benötigten TCP-Ports niedrig zu halten, zumal diese auf eventuellen inner- oder zwischenbetrieblichen Firewalls freigeschaltet werden müssen. Aus diesem Grund bietet WCF die Möglichkeit, verschiedene Services über denselben TCP-Port zur Verfügung zu stellen. Voraussetzung dafür ist, dass sich die einzelnen Service-URLs unterscheiden, dass Port-Sharing für das netTcpBinding aktiviert wird und dass der Windows-Service Net.Tcp Port Sharing Service gestartet ist.
Das nachfolgende Listing zeigt eine Konfiguration, die den Einsatz von Port-Sharing vorsieht. Dazu wurde in der Standard-Binding-Konfiguration für netTcpBinding die Eigenschaft portSharingEnabled auf true gesetzt und als Basisadresse net.tcp://localhost:9000/FlugBuchungsService definiert. Ein anderer Service-Host könnte nun ebenfalls Port 9000 verwenden, sofern er sich auf eine andere Service-Url abstützt (zum Beispiel net.tcp://localhost:9000/HotelService und ebenfalls Port-Sharing aktiviert.

Bei Betrachtung dieser Konfiguration fällt auf, dass für die Konfiguration von Metadata-Exchange ebenfalls das netTcpBinding und nicht das dafür vorgesehene mexTcpBinding herangezogen wurde. Das ist notwendig, um Probleme im Zusammenhang mit letzterem Binding beim Einsatz von Port-Sharing zu vermeiden.
<system.serviceModel>

    <bindings>
      <netTcpBinding>
        <binding portSharingEnabled="true">
          <security mode="None" />
        </binding>
      </netTcpBinding>
    </bindings>

    <services>
    
      <service name="FlugService.FlugBuchungsService">

        <endpoint
          address=""
          binding="netTcpBinding"
          contract="FlugService.IFlugBuchungsService" />

        <endpoint
          address="mex"
          binding="netTcpBinding"
          contract="IMetadataExchange" />

        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:9000/FlugBuchungsService" />
          </baseAddresses>
        </host>

      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>


  </system.serviceModel>

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

28.05.2011 13:40:48
WCF und Port-Sharing bei netTcpBinding http://bit.ly/kZyD6L
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

28.05.2011 11:33:27
Verteilte Systeme und Services mit .NET 4.0: Konzepte und Lösungen mit WCF 4.0 http://bit.ly/mkXRat
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Verteilte Systeme und Services mit .NET 4.0: Konzepte und Lösungen mit WCF 4.0

28.05.2011 10:38:00

Diese Woche habe mein Buch Verteilte Systeme und Services mit .NET 4.0: Konzepte und Lösungen mit WCF 4.0, das ich gemeinsam mit Holger Schwichtenberg geschrieben habe und in das einige Teile aus dem Vorgänger Buch von Matthias Fischer und Jörg Krause eingeflossen sind, fertiggestellt. Das ganze soll noch im Juli auf den Markt kommen. Bei diesem Buch war es uns wichtig, nicht nur auf WCF 4 einzugehen, sondern auch auf benachbarte Technologien, die man in Praxis gemeinsam mit WCF einsetzen muss, darunter die Worflow Foundation (WF), Entity Framework (EF), Data Services, RIA Services, Windows Identity Foundation (WIF) und Azure AppFabric.

Nachfolgend  das Inhaltsverzeichnis. 

  1. Serviceorientierung
  2. Überblick zu WCF
  3. Services mit WCF erstellen
  4. REST-Services mit WCF
  5. Sichere Zustellung und Transaktionen
  6. WS-Reliable Messaging, Transaktionen, MSMQ/ Queued Services)
  7. Datenbasierte Services (WCF im Zusammenspiel mit Entity Framework 4.1, insbesondere Self-Tracking Entities, WCF Data Services, WCF RIA Services)
  8. Workflows mit WF
  9. Hosting (Self-Hosting mit Windows-Diensten, IIS, AppFabric)
  10. Systemintegration und erweiterte Szenarien (Routing, Discovery, Publish/Subscribe, ESB mit WCF entwickeln)
  11. Sicherheit (Sicherheitsszenarien inkl. Single-Sign-On mit Windows Indentity Foundation, WIF)
  12. WCF und Azure AppFabric (AppFabric Service Bus, AppFabric Access Control)
  13. Erweiterungsmodell
  14. WCF erweitern

Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

26.05.2011 07:40:49
Blog: Neue Funktionen für Visual Studio "dev11" im Bereich ALM/TFS von Microsoft angekündigt. http://heise.de/-1244780
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Vom Projekt- zum Netzwerkmanagement

23.05.2011 12:39:26
Was ist eigentlich ein (soziales) Netzwerk und was hat das mit Projektmanagement zu tun? Fragen wie diese wurden letzte Woche auf der interPM diskutiert.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Neue Funktionen für Visual Studio "dev11"

17.05.2011 18:44:23
Auf der TechEd USA hat Microsoft erste Funktionen des Nachfolgers von Visual Studio 2010 (10.0) öffentlich vorgestellt.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.05.2011 10:14:40
Blog: Dritter Teil des Azure-Tutorials in der iX 5/2011 http://www.heise.de/-1235363.html. Testaccount: http://www.msdn-online.de/go/IX
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.05.2011 10:11:21
Blog: WCF: Anpassung der Serialisierung von String-Listen mit dem CollectionDataContractAttribute: http://www.heise.de/-1235365.html
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

.NET: End-to-End PowerWorkshop: 6. bis 10. Juni 2011

09.05.2011 18:45:00

Von 6. bis 10. Juni 2011 gestalte ich mit Joachim Fuchs von IT-Visions im Auftrag von MS Employ einen PowerWorkshop zum Thema ".NET: End-to-End". Das Ziel dieses Workshops liegt darin zu vermitteln, wie komplexe Unternehmensanwendungen durch das Zusammenspiel verschiedener .NET-Technologien entwickelt werden können.

Dabei werden die folgenden Themen behandelt:

- .NET 4
- Silverlight 5
- WPF 4
- SL 5
- RIA-Services
- WCF 4
- Entity Framework 4.1
- ASP.NET MVC
 

Weitere Informationen finden sich im Folder zum Workshop (517,92 kb)

 

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

09.05.2011 17:12:39
.NET: End-to-End PowerWorkshop: 6. bis 10. Juni 2011 http://bit.ly/j5B84W
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Dritter Teil des Azure-Tutorials in der iX: Azure AppFabric

09.05.2011 10:59:20
Beim dritten Teil des Azure-Tutorials geht es um Zugangskontrolle und den Service Bus, der eine Integration von Diensten an unterschiedlichen Standorten erlaubt.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

WCF-Tipp: Anpassung der Serialisierung von String-Listen mit CollectionDataContractAttribute

04.05.2011 10:09:24
Standardmäßig serialisiert WCF eine Zeichenkettenliste mit -Tags. Wenn man hier den Tag-Namen ändern will, hilft die Annotation [CollectionDataContractAttribute].
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

.NET-Entwickler-Konferenz "NEK 2011" in Nürnberg und Hannover

29.04.2011 08:59:18
Die NEK findet am 7./8. Mai in Nürnberg und am 21./22. Mai in Hannover statt. Schwerpunkt sind RAD-Themen wie LightSwitch und WebMatrix.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

29.04.2011 07:52:50
.NET Entwicklerkonferenz "NEK" 7./8. Mai in Nürnberg und am 21./22. Mai in Hannover: Schwerpunkt .NET-RAD. http://www.heise.de/-1234726.html
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

OData-Unterstützung mit WCF

26.04.2011 22:40:00

OData [1] definiert, wie über eine REST-Schnittstelle Abfragen definiert werden können. Die aktueller Preview-Version der WCF Web API [2] bietet auf einfache Weise unterstützung für diesen Standard. Um die von einem REST-Service angebotenen Daten abfragen zu lassen, muss lediglich eine Service-Operation, die ein IQueryable<T> zurückliefert, bereitgestellt werden.

[WebGet(UriTemplate = "")]
public IQueryable<Ticket> GetApprovedOrders()
{
    return Repository.Tickets.AsQueryable();
}

Die über diese Operation bereitgestellten Daten können nun unter Verwendung von Parametern, die sich an OData orientieren, abgefragt werden:

http://.../tickets?$filter=LastName eq Sorglos&$orderby=TicketId desc

Dabei gilt zu bachten, dass im Zuge dessen das IQueryable erweitert wird und somit mit diesem in weiterer Folge nur die wirklich benötigten Daten abgerufen werden. Somit lassen sich komfortabel und performant "Remote-Wrapper" für O/R-Mapper etc. entwickeln.

[1] http://www.odata.org/
[2] http://wcf.codeplex.com/


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

26.04.2011 21:09:25
OData-Unterstützung mit WCF http://bit.ly/fZ4NZt
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Zweiter Teil des Azure-Tutorials in der iX: Azure Storage Services

26.04.2011 11:19:37
Im zweiten Teil des Windows Azure-Tutorials in iX 4/2011 lernt man, wie man eine Anwendung, die SQL Azure als relationale Datenbank verwendet, auf die kostengünstigeren und besser skalierbaren Azure Storage Services umstellt.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

20.04.2011 07:03:06
Datenzugriffs-Kolumne in dotnetpro 5/2011 Seite 104ff: "Schlingerkurse". Es geht um die Parallelentwicklungen LTS/EF und Data/RIA Services
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Microsoft .NET Framework 4.5

18.04.2011 09:49:39
Es gibt zwar noch keine offizielle Ankündigungen, aber eine erste Erwähnung von ".NET 4.5" als Versionsnummer für die kommende Version von .NET.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

18.04.2011 08:13:10
Blogged: Nächste .NET-Version wird wohl ".NET 4.5" sein. Erste Erwähnungen im Web, z.B. bei der TechEd US: http://www.heise.de/-1229095.html
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

15.04.2011 07:09:33
Blogged: PDC 2011: 13. bis 15. September 2011 in Anaheim bei LA http://www.heise.de/-1227725.html
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

PDC 2011: 13. bis 15. September in Anaheim bei LA

14.04.2011 07:44:14
Microsoft hat auf der MIX 2011 verraten, dass die nächste PDC vom 13. bis 15. September 2011 in Anaheim bei LA stattfindet.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.04.2011 12:55:21
Noch bis zum 19.4.: Frühbuchertarif bei der BASTA on Tour ".NET-Architektur" am 19.+20.5. in Düsseldorf: http://heise.de/-1226227.html
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

BASTA on Tour am 19. und 20. Mai in Düsseldorf

12.04.2011 13:50:53
Die .NET-Konferenz BASTA gastiert für zwei Tage in Düsseldorf mit dem Thema "Architektur und Good Practices". Frühbucher sparen noch bis 19. April.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

12.04.2011 08:22:34
Blogged: ADO.NET Entity Framework 4.1: Endlich Eager Loading mit Lambda-Ausdrücken statt Zeichenketten! http://www.heise.de/-1222381.html
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

ADO.NET Entity Framework 4.1: Endlich Eager Loading mit Lambda-Ausdrücken statt Zeichenketten

11.04.2011 10:19:29
Eine wirklich erhebliche Verbesserung im ADO.NET Entity Framework 4.1 ist die Möglichkeit, die für das Eager Loading notwendigen Include()-Anweisungen durch Lambda-Ausdrücke anzugeben statt wie bisher durch Zeichenketten.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

06.04.2011 22:01:01
Definitiv keine TechEd Europe 2011 :-(. Erst 2012 wieder. Dann wieder Amsterdam: 25. bis 29.6.2012 statt Berlin. http://heise.de/-1223158
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Nächste TechEd Europe erst im Juni 2012

06.04.2011 18:39:16
2011 gibt es keine TechEd Europe bei Microsoft. Der nächste Termin ist vom 25. bis 29. Juni 2012.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

05.04.2011 23:12:36
Extension Methods in Java 8 erlauben im Gegensatz zu denen in .NET dynamisches Binden, sind dafür aber recht nahe an Multiple-Inheritance...
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

05.04.2011 11:28:59
Speaking at SDC 2011 #scandev in Göteborg was fun! 11 parallel tracks, 700+ visitors -&gt; great event...
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Eindrücke von den SOA-Days

02.04.2011 23:19:00

Diese Woche hatte ich die Ehre, auf den SOA-Days 2011 in Bonn zu sprechen. Der Veranstalter hat nun ein paar Fotos online gestellt. Ein paar davon findet man nachfolgend. Weitere Fotos findet man hier.

 

 

 

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Azure und NoSQL mit Storage Services: Tutorial, Teil 2

02.04.2011 14:02:00

Der große Vorteil Cloud-basierter Lösungen liegt in ihrer hochgradigen Elastizität. Mit vermehrten Benutzeraufkommen können per Mausklick weitere Instanzen zur Abarbeitung der anfallenden Aufgaben angefordert werden. Dies ermöglichte beispielsweise den Betreibern von Animoto ihr Web-Angebot, welches sich ursprünglich auf weniger als 100 Instanzen abstützte, binnen weniger Stunden auf über 3400 (!) Instanzen zu skalieren. Bei solch einem Vorhaben stoßen klassische relationale Datenbanken rasch an ihre Grenzen.  

Das Azure-Tutorial in der aktuellen iX, das von Holger Schwichtenberg und mir geschrieben wurde, wendet sich dieser Problemstellung zu, und zeigt, wie diese durch den Einsatz der Azure Storage Services umgangen werden kann sowie wo die Konsequenzen dieses NoSQL-basierten Ansatzes liegen. 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

02.04.2011 12:14:09
Azure und NoSQL mit Storage Services: Tutorial, Teil 2 http://bit.ly/hpopl3
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

01.04.2011 15:57:24
@chwenz @MVPAward: Herzlichen Glückwunsch!
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

01.04.2011 15:56:39
Blogged: ADO.NET Entity Framework 4.1 jetzt als RC: http://www.heise.de/-1218572.html. Code Only und DbContext als Ersatz für ObjectContext
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Entity Framework 4.1: Code Only mit Attributen anpassen

31.03.2011 22:50:00

Das nachfolgende Beispiel demonstriert die Verwendung aller Attribute, die man zum Mappen von Klassen auf Tabellen mit Entity Framework 4.1 Code Only verwenden kann. Eine mächtigere jedoch auch komplexere Alternative dazu stellt die Fluent-API, die zu diesem Zweck auch mit EF 4.1 bereitgestellt wird, dar. Aber das ist eine andere Geschichte und somit Bestandteil eines weiteren künftigen Postings.

[Table("KategorienTable")]
    public class ProduktKategorie
    {
        [Key]
        [Column("Kategorie_Nummer", Order = 1)]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int KategorieNr { get; set; }

        [Required, MaxLength(50)]
        public string KategorieBezeichnung { get; set; }
        public virtual ICollection<Produkt> Produkte { get; set; }

        public virtual ICollection<Produkt> Aktionen { get; set; }

        [ConcurrencyCheck]
        [Column("Version", Order = 2, TypeName="int")]
        public int Version { get; set; }
    }

    [ComplexType]
    public class ProduktDetails
    {
        public string Beschreibung { get; set; }
        public string BildPfad { get; set; }
        public string HerstellerLink { get; set; }
    }

    public class Produkt
    {
        public int ProduktId { get; set; }
        public ProduktDetails Details { get; set; }
        public string Bezeichnung { get; set; }
        public double Preis { get; set; }

        [TimestampAttribute]
        public byte[] Zeitstempel { get; set; }

        [NotMapped]
        public double BruttoPreis { get { return Preis * 1.19; } }

        // Fremdschlüsselmapping
        public virtual int KategorieNr { get; set; }

        [ForeignKey("KategorieNr")]
        [InverseProperty("Produkte")]
        public virtual ProduktKategorie Kategorie { get; set; }

        [InverseProperty("Aktionen")]
        public virtual ProduktKategorie AktionInKategorie { get; set; }

    }

    public class ShopContext : DbContext
    {
        public ShopContext() : base("ShopDb") { }

        public DbSet<Produkt> Produkte { get; set; }
        public DbSet<ProduktKategorie> Kategorien { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Database.SetInitializer<ShopContext>(new DropCreateDatabaseAlways<ShopContext>());
            
            using (var ctx = new ShopContext())
            {
            
                ProduktKategorie kat = new ProduktKategorie();
                kat.KategorieBezeichnung = "Bücher";
                kat.KategorieNr = 7;

                Produkt p1 = new Produkt();
                p1.Bezeichnung = ".NET 4 UPDATE";
                
                p1.Details = new ProduktDetails();
                p1.Details.Beschreibung = "Von .NET 3 auf .NET 4 ...";
                p1.Details.BildPfad = null;
                p1.Details.HerstellerLink = "http://tinyurl.com/net4update";
                
                p1.Kategorie = kat;

                kat.Produkte = new List<Produkt> { p1 };

                ctx.Kategorien.Add(kat);
                ctx.SaveChanges();
                
            }

        }
    }

Standardmäßig versucht dieses Beispiel, eine Datenbank ShopDb in der SQL-Server Instanz .\SQLEXPRESS anzulegen. Ist dies nicht gewünscht, kann die zu verwendende Datenbank durch Festlegen einer Datenbankverbindungszeichenfolge mit dem Namen ShopDb in der app.config angegeben werden.


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

31.03.2011 21:13:07
Entity Framework 4.1: Code Only mit Attributen anpassen http://bit.ly/fpDP3y
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

31.03.2011 20:21:01
Talk SOA entmystifiziert auf den SOA Days 2011 hat Spass gemacht - den Teilnehmern denke ich auch :) Bin nun wieder zu Hause.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Release Candidate für ADO.NET Entity Framework 4.1

31.03.2011 08:39:10
Außerhalb des Veröffentlichungszyklus des .NET Framework wird Microsoft neue Funktionen für das ADO.NET Entity Framework freigeben.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

18.03.2011 17:43:57
Tutorial zu Windows Azure in der iX - mit kostenfreiem Azure-Zugang für 90 Tage (ohne Verlängerungsfalle!) http://www.heise.de/-1210731.html
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tutorial zu Windows Azure in der iX

18.03.2011 17:09:17
Mit der iX-Ausgabe 3/2011 hat ein dreiteiliger Lehrgang zur Programmierung von Anwendungen für Microsofts Cloud-Plattform begonnen - inklusive kostenfreiem Testzugang für 90 Tage.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

16.03.2011 11:11:19
NLocalize: Lokalisierung von .NET-Applikationen (WPF, SL, Phone 4) - klingt echt vielversprechend: neovelop.com
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

15.03.2011 09:17:18
Meine Datenzugriffskolumne in der aktuellen #dotnetpro stellt den Entity Framework Profiler vor: http://efprof.com. Gut, aber etwas teuer.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Azure-Session auf Jazoon in Zürich

09.03.2011 23:29:00

Auf der kommenden Jazoon (International Conference on the modern art of software), welche von 21. bis 23. Juni 2011 in Zürich stattfinden wird, werde ich zwei Vorträge zu Cloud Computing mit Windows Azure halten. Im ersten werde ich zeigen, wie man mit Windows Azure AppFabric Service Bus und Access Control unternehmensübergreifende Geschäftsprozesse realisieren kann. Im zweiten Vortrag geht es dann um das Thema Datenzugriff in der Cloud und um die Problematik, dass relationale Datenbanken nicht ohne weiters mit der Möglichkeit, Cloud-Anwendungen hochgradig zu skalieren, mithalten können.

Nachfolgend platziere ich die vorläufigen Abstracts.

Service Bus in the cloud

Windows Azure AppFabric Service Bus offers the possibility to integrate applications located at different locations as well as in the cloud. This session shows by an example how it can be used for automating corporation-comprehensive  business processes.

By by relational database and ACID-transactions: An introduction into BASE and NoSQL by the example Windows Azure Storage Services

In view of scalability and availability, huge companies like Amazon, Google or eBay don’t use relational databases for their web-applications anymore. Instead of that and instead of ACID-transactions, they use approaches like NoSQL (Not only SQL) and BASE, which stands for basically available, soft state, eventually consistent. This session shows why those concepts improve scalability and availability and how Azure Storage Services implement them. 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Azure Tutorial in iX

09.03.2011 23:16:00

Mit der aktuellen iX startet ein drei-teiliges Tutorial zu Windows Azure, welches Holger Schwichtenberg gemeinsam mit mir verfasst hat. Im ersten Teil beschreiben wir, wie man eine herkömmliche ASP.NET-Anwendung in die Cloud bringen kann. Im Zuge dessen wird auch auf SQL Azure eingegangen. Im zweiten Teil geht es um die Verwaltung von Daten mit den Azure Table Services (Table Service, Blob Service, Queue Services). Im Zuge dessen wird auch das Problem, dass klassische relationale Datenbanken nicht mit den extreme Skalierungsmöglichkeiten, die durch Cloud-Computing geboten werden, schritthalten können, adressiert. Im dritten Teil wird es dann um Windows Azure AppFabric gehen. In diesem Teil des Tutorials werden wir zeigen, wie man Cloud-Anwendungen mit lokalen mittels AppFabric Service Bus verbinden kann und welche Möglichkeiten es in Hinblick auf Security dabei gibt (AppFabric Access Control).


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

NServiceBus

09.03.2011 23:10:00

Die freie Implementierung NServiceBus erweitert Microsoft Message Queues um die Möglichkeit zur Implementierung von Publish/Subscribe-Szenarien. Darüber hinaus wird auch Unterstützung für Verschlüsselung, WCF-Integration und langlaufende Transaktionen geboten.

In meinem Artikel im aktuellen dot.net-magazin beschreibe ich anhand vieler Beispiele diese Technologie. 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

09.03.2011 23:09:48
Azure-Sessions auf Jazoon in Zürich http://bit.ly/hC7cyt
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

09.03.2011 22:35:48
NServiceBus http://bit.ly/elIEhF
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

09.03.2011 22:35:48
Azure Tutorial in iX http://bit.ly/iesDuK
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Visual Studio 2010 SP1 verfügbar

08.03.2011 09:14:09
Das erste Service Pack von Visual Studio 2010 ist ab heute verfügbar.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Entity Framework 4.1: Code Only und abgehängte Entitäten

03.03.2011 23:39:00

In einigen Wochen wird Entity Framework 4.1 als RC verfügbar sein und das lang erwartete Programmiermodell "Code Only", welches ohne explizites Entity Data Model auskommt und eigene Klassen aufgrund von Konventionen auf Tabellen mappt, zur Verfügung stellen. Glücklicherweise kann dieses Programmiermodell auch ganz gut mit abgehängten Entitäten umgehen, was bei den "Ur-Entitäten" der ersten Stunde leider nicht der Fall war. Nach dem Wieder-Anhängen eines Objektgraphens mittels Attach sind lediglich die Zustände der einzelnen Objekte zu setzen (Added, Modified, Deleted etc.). Das nachfolgende Listing demonstriert dies.

using (var ctx = new HotelContext())
{
    ctx.Regionen.Attach(region);

    ctx.Entry<Hotel>(h3).State = System.Data.EntityState.Added;
    ctx.Entry<Region>(region).State = System.Data.EntityState.Modified;
    ctx.Entry<Hotel>(h1).State = System.Data.EntityState.Modified;

    ctx.SaveChanges();
}

POCO-Entitäten verhalten sich übrigens gleich, wenn auch die Anweisungen zum Setzen der Zustände ein wenig anders aussehen.


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

03.03.2011 22:46:34
Entity Framework 4.1: Code Only und abgehängte Entitäten http://bit.ly/eVICCU
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

BASTA! on Tour - Architecture (#bastacon)

03.03.2011 00:47:00

Die BASTA! Spring 2011 ist kaum vorbei, da blicken wir schon in die Richtung der nächsten BASTA! - Gemeint ist die BASTA! on Tour: Architecture, welche am 19. und 20. Mai in Düsseldorf stattfinden wird. Am ersten Tag finden parallel vier Ganztagesworkshops statt; am zweiten Tag parallel in zwei Tracks insgesamt acht Sessions. Nachfolgend ein paar Infos dazu:

Workshops am 19. Mai 2011

  • ADO.NET Entity Framework (EF), Dr. Holger Schwichtenberg www.IT-Visions.de
  • Einstieg in jQuery, Christian Wenz Arrabiata Solutions
  • Verteilte Anwendungen mit WCF, Manfred Steyer FH CAMPUS 02 | www.IT-Visions.de
  • Windows Presentation Foundation (WPF), Jörg Neumann Acando/thinktecture

Sessions am 20. Mai 2011

  • WPF Architecture Patterns, Jörg Neumann Acando/thinktecture
  • Der Wegweiser im Dschungel der .NET-Techniken und -Werkzeuge, Dr. Holger Schwichtenberg www.IT-Visions.de
  • Web-2.0-Anwendungen mit ASP.NET MVC 3, Entity Framework und jQuery, Manfred Steyer FH CAMPUS 02 | www.IT-Visions.de
  • WPF Tipps & Tricks, Jörg Neumann Acando/thinktecture
  • ADO.NET Entity Framework - Tipps, Tricks & Best Practices, Dr. Holger Schwichtenberg www.IT-Visions.de
  • Javascript-Patterns, Christian Wenz Arrabiata Solutions
  • Entity Framework und WCF: ein Widerspruch?, Dr. Holger Schwichtenberg www.IT-Visions.de
  • RIA Best Practices, Christian Wenz Arrabiata Solutions

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

03.03.2011 00:02:30
BASTA! on Tour - Architecture (#bastacon) http://bit.ly/h2Synb
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Folien und Beispiele der BASTA-Konferenz

02.03.2011 17:54:23
Unterlagen zu den Vorträgen über ADO .NET Entity Framework und Windows Communication Foundation (WCF) 4.0.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Eigene Connection Strings beim Entity Framework richtig übergeben

26.02.2011 08:14:07
Bei der Übergabe eines eigenen Connection String an einen "ADO.NET Entity Framework"-Kontext ist zu beachten, dass im Code die Syntax ein klein wenig anders ist als in der Konfigurationsdatei.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

23.02.2011 15:50:03
#BASTACON: Mein Vortrag ADO.NET Entity Framework Tipps & Tricks http://www.it-visions.de.v6149.aspx
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

23.02.2011 15:49:31
Folien und Beispiele zur Session Entity Framework und geschichtete Applikationen online: http://bit.ly/hJ2VsN (#bastacon)
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Entity Framework und Schichtentrennung: Ein Widerspruch? - Unterlagen und Beispiele zur Session auf der BASTA! Spring (#bastacon)

23.02.2011 14:31:00

Das Beispiel [1] und die Unterlagen [2] zu meiner Session Entity Framework und Schichtentrennung: Ein Widerspruch?, die ich heute auf der BASTA! Spring 2011 gemacht habe, finden sich unter den nachfolgenden Links. Daneben findet man die SQL-Skripts der verwendeten Tabellen unter [3]. Das Beispiel verwendet WCF in Kombination mit Entity Framework und Self-Tracking Entities sowie WPF, wobei im View-Model die geänderten Objekte ermittelt und zurück zum Server gesendet werden.

Hinweis für die deutsche Version von Visual Studio 2010: Die deutsche Version von Visual Studio 2010 kommt mit fehlerhaften Templates für Self-Tracking Entities. Um dieses Problem zu umgehen, könnten das T4-Template aus den obigen Beispielen kopiert werden. In den kopierten T4-Templates müsste dann noch der Verweis auf das Entity Data-Model angepasst werden.

[1] http://www.softwarearchitekt.at/downloads/BASTA-Spring-2011-HotelSampleApp.zip

[2] http://www.softwarearchitekt.at/downloads/BASTA-Spring-2011-EntityFrameworkundSchichtentrennung.pdf

[3] http://www.softwarearchitekt.at/downloads/tables.sql

 

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

23.02.2011 13:55:46
Interessante Session "ADO.NET Entity Framework – Tipps & Tricks" mit vielen Erfahrungswerten zu EF 4 von Holger Schwichtenberg (#bastacon)
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

22.02.2011 17:39:23
@K_Friedrich eigentlich habe ich ja nur die richtige Welt in meiner DEMO-App. nachgebildet :)
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

22.02.2011 16:05:52
Mein Vortrag: Routing, Lastverteilung und Failover mit WCF 4.0 auf der #BASTAcon Spring 2011: http://www.it-visions.de/v6150.aspx
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

21.02.2011 15:44:06
Interessante Session über Change Management von Wolfgang Böhlmann am Agile Day der BASTA! #bastacon
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

21.02.2011 12:10:45
Gleich spreche ich auf der #bastacon über Use Cases und User Stories in agilen Projekten.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

19.02.2011 15:58:22
Ich wollte mich zur Plagiats-Affäre ja schriftlich äußern – mein Ghostwriter ist aber gerade auf Urlaub …
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Clientseitige Validatoren mit ASP.NET MVC 3 und unobstrusive JavaScript (Teil 2 von 3)

18.02.2011 22:28:00

Im ersten Teil dieser Artikelserie wurde gezeigt, wie man mit ASP.NET MVC 3 und jQuery clientseitige Validierungslogiken hinzufügen kann. Dazu wurde die Methode $.validator.unobtrusive.adapters.addBool("hamsterfarbe") verwendet, um die zuvor definierte Validierungs-Regel für die Verwendung mit unobstrusive Validation zu aktivieren. "Aktiviert" bedeutet hierbei, dass die HTML5-Validierungsregel hamsterfarbe, die deklarativ für einzelne Elemente definiert wird, durch die gleichnamige jQuery-Validierungsregel implementiert wird. Weichen die Namen der beiden Validierungsregeln voneinander ab, kann eine Überladung dieser Funktion, welche beide Namen entgegennimmt, herangezogen werden. Der Name addBool ist hier etwas irreführend, denn die Methode aktiviert einfach eine Validierungs-Regel, die abgesehen vom Wert und einen Verweis auf das zu validerende Element keine weiteren Parameter entgegennimmt. Warum Sie addBool heißt wird im Zuge des dritten Teils dieser Serie, in der tiefer in die Thematik eingetaucht wird, erläutert.

Neben addBool stehen noch weitere Methoden zum Aktivieren von Validierungs-Regeln zur Verfügung. Beispielsweise wird mit addSingleValue definiert, dass an die zu aktivierende Regel ein bestimmter Parameter übergeben werden soll. Im nachfolgenden Beispiel handelt es sich dabei um den Parameter casesensitive.

$.validator.addMethod(
    "hamsterfarbe",
    function (value, element, isCaseSensitive) {

        if (isCaseSensitive == "false") {
            value = value.toLowerCase();
        }
            
        if ($("#Name").val() == "Krümel" && value != "gold") return false;

        return true;
    });

$.validator.unobtrusive.adapters.addSingleVal("hamsterfarbe", "casesensitive");

Der Wert für den Parameter casesensitive wird bei Verwendung von ASP.NET MVC 3 bereits serverseitig beim Beschreiben der Validierungsregel festgelegt.

public class HamsterFarbeValidationAttribute : ValidationAttribute, IClientValidatable
{
    [...]

    // Client-seitige Validierung
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = "Aber Krümel ist doch ein Goldhamster !!!",
            ValidationType = "hamsterfarbe"
        };
            
        rule.ValidationParameters.Add("casesensitive", "false");
        rule.ValidationParameters.Add("autocorrect", "true");
            

        // Für weitere Infos siehe [Nils Holgersson]

        yield return rule;
    }

}

Für Validierungsregeln, welche prüfen, ob sich ein Wert innerhalb eines bestimmten Wertebereichs befindet, kann die Methode addMinMax verwendet werden. Diese Methode erwartet den Namen der HTML5-Validierungsregel sowie die Namen von drei jQuery-Validierungsregeln, wobei eine nur auf die untere Schranke, eine nur auf die obere Schranke oder die letzte sowohl auf die untere als auch auf die obere Schranke prüft.

$.validator.addMethod(
    "percentageminmax",
    function (value, element, minmax) {


        var min = parseInt(minmax[0]);
        var max = parseInt(minmax[1]);

        if (value < min || value > max) return false;
        return true;
    });

    $.validator.addMethod(
    "percentagemin",
    function (value, element, min) {


        alert(min);
        if (value < min) return false;
        return true;
    });

    $.validator.addMethod(
    "percentagemax",
    function (value, element, max) {

        if (value > max) return false;
        return true;
    });

    $.validator.unobtrusive.adapters.addMinMax("percentageminmax", "percentagemin", "percentagemax", "percentageminmax");

Das nachfolgende Listing zeigt ergänzend zum letzten die dazugehörige Server-seitige Implementierung von IClientValidatable. Hier werden auch die Parameter, welche die untere sowie obere Schranke darstellen, definiert. Standardmäßig werden diese als min und max bezeichnet.

public class PercentageMinMaxValidationAttribute : ValidationAttribute, IClientValidatable
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        // Serverseitige Validierung ist für dieses Beispiel nicht relevant... 
        return ValidationResult.Success;
    }

    // Client-seitige Validierung
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = "Wert befindet sich ausserhalb des Gültigkeitsbereichs",
            ValidationType = "percentageminmax"
        };
            
        rule.ValidationParameters.Add("min", "0");
        rule.ValidationParameters.Add("max", "100");

        yield return rule;
    }

}

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Code Only mit Entity Framework CTP 5

18.02.2011 22:13:00

Mit Entity Framework CTP 5 steht ein Ausblick auf ein Feature zur Verfügung, welche recht wahrscheinlich in der nächsten Version des Entity Frameworks einzug halten wird: Code Only. Es erlaubt das Mappen von Entitäten auf Tabellen anhand bestimmter Konventionen. Für Fälle, in denen diese Konventionen nicht passen, können Sie über ein Fluent-Interface oder über Attribute abgeändert werden. Diese Vorgehensweise, die sehr an jener von (N)Hibernate erinnert, hat den Vorteil, dass das Entity Data Model wegfällt und sich die Entitäten somit leichter auf verschiedene Assemblies aufteilen lassen. Ferner kann mit dem Entwickeln des OO-Modells in Form von Klassen begonnen werden.

Das nachfolgende Listing liefert einen ersten Vorgeschmack darauf.

public class HotelContext : DbContext
{
    public HotelContext(): base("HotelDb-CodeFirst") { }

    public DbSet<Hotel> Hotels { get; set; }
    public DbSet<Region> Regionen { get; set; }
}


[Table("RegionenTab")]
public class Region
{
    [Key]
    [Column(Name="Region_Code", Order=1)]
    [DatabaseGenerated(DatabaseGenerationOption.None)]
    public virtual int RegionCode { get; set; }

    [MaxLength(27)]
    [Required]
    [Column(Name = "Bez", Order = 3)]
    public virtual string Bezeichnung { get; set; }
    public virtual ICollection<Hotel> Hotels { get; set; }

    public virtual ICollection<Hotel> TopRanked { get; set; }

    [ConcurrencyCheck]
    [Column(Name = "Version", Order = 2, TypeName="bigint")]
    public virtual int Version { get; set; }
}


[ComplexType]
public class Adresse
{
    public virtual string Strasse { get; set; }
    public virtual string Plz { get; set; }
    public virtual string Ort { get; set; }
}

public class Hotel
{
    public virtual int HotelId { get; set; }
    public virtual Adresse Adresse { get; set; }
    public virtual string Bezeichnung { get; set; }
    public virtual int Sterne { get; set; }

    [InverseProperty("TopRanked")]
    public virtual Region TopRankedInRegion { get; set; }

    public virtual int RegionCode { get; set; }

    [TimestampAttribute]
    public virtual byte[] LetzteModifikation { get; set; }

    public virtual double Preis { get; set; }

    [NotMapped]
    public virtual double TouristenPreis { get { return Preis * 2; } }

    public virtual Kategorie Kategorie { get; set; } 

    [ForeignKey("RegionCode")]
    [InverseProperty("Hotels")]
    public virtual Region Region { get; set; } 
    public virtual ICollection<Merkmal> Merkmale { get; set; }
}

 Weitere Infos dazu finden sich in meinem aktuellen Artikel im .NET Magazin.


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

18.02.2011 22:12:17
Clientseitige Validatoren mit ASP.NET MVC 3 und unobstrusive JavaScript (Teil 2 von 3) http://bit.ly/gSt6wP
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

18.02.2011 21:41:45
Code Only mit Entity Framework CTP 5 http://bit.ly/egRfsO
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

17.02.2011 16:39:03
Meine neue Kolumne in der dotnetpro ab Ausgabe 3/2011: "Aus der Datenzugriffspraxis". Erstes Thema: Model First. http://www.dotnetpro.de
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Service Pack 1 von Windows 7 und Windows Server 2008 R2 sind fertig

17.02.2011 08:29:01
MSDN-Abonnenten können schon jetzt das fertige Service Pack 1 von Windows 7 und Windows Server 2008 R2 herunterladen.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

16.02.2011 23:58:59
Service Pack 1 von Windows 7 und Windows Server 2008 R2 sind fertig. Zunächst aber nur mit MSDN-Abo http://bit.ly/HrsQ verfügbar.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

16.02.2011 09:56:26
Noch 3 Jahre bist zum HTML5-Standard http://www.heise.de/-1189408.html :-( und noch 30 Jahre bis dann alle einen HTML5-Browser haben? :-(((
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

15.02.2011 16:29:08
Oracle bietet zumindest eine Beta des eigenen, lange angekündigten ADO.NET Entity Framework Providers an: http://www.heise.de/-1190119.html
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

14.02.2011 13:54:59
Blogged: NTFS-Dateisystemtransaktionen in .NET programmieren mit dem Transactional NTFS Managed Wrapper: http://www.heise.de/-1188587.html
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

NTFS-Dateisystemtransaktionen mit .NET programmieren

13.02.2011 09:14:03
Um in .NET die Transaktionsmöglichkeiten des NTFS-Dateisystems aus Windows zu nutzen, greift man am besten auf den "Transactional NTFS Managed Wrapper" und System.Transactions zurück.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

13.02.2011 00:20:50
Der .NET Reflector wird ab März nicht mehr kostenlos sein :-(: http://bit.ly/dF3tZD
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

11.02.2011 11:31:19
Gewinner unserer Verlosung http://bit.ly/g77ZFf: Kai Masannek aus Tülau fährt zur BASTA . Gückwunsch! Seine Rezension: http://amzn.to/f3haet
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Und schon wieder eine neue .NET-Konferenz in Deutschland

11.02.2011 09:54:08
Nun steigt auch die amerikanische devconnections-Konferenz in den deutschen .NET-Markt ein.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Tweet von ManfredSteyer

05.02.2011 14:35:03
Clientseitige Validatoren mit ASP.NET MVC 3 und unobstrusive JavaScript (Teil 1 von 3) http://bit.ly/fsIfeF
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Clientseitige Validatoren mit ASP.NET MVC 3 und unobstrusive JavaScript (Teil 1 von 3)

05.02.2011 01:00:00

ASP.NET MVC 3 verwendet standardmäßig unobstrusive JavaScript für das Validieren von Eingaben, indem die Validierungslogiken mit HTML 5-Tags und -Attributen beschrieben und mittels jQuery zum Leben erweckt werden. Das Ergebnis manifestiert sich in kürzeren und besser lesbaren HTML-Seiten, die ohne bzw. zumindest mit weniger eingebetteten JavaScript-Blöcken auskommen. Darüber hinaus ist client-seitiges Validieren ab Version 3 standardmäßig aktiviert. Konfiguriert können diese beiden Aspekte über die web.config werden:

<appSettings>
       <add key="ClientValidationEnabled" value="true"/> 
       <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
</appSettings>  

In weiterer Folge wird davon ausgegangen, dass diese beiden Parameter, wie oben gezeigt, jeweils auf ihren Standardwert (true) belassen wurden.

Um ein Validierungs-Attribut, welches nicht nur serverseitig sondern auch clientseitig Anwendung findet, ist - wie nachfolgend demonstriert - von ValidationAttribute abzuleiten sowie zusätzlich das Interface IClientValidatable zu implementieren. Dieses Interface gibt die Methode GetClientValidationRules, welche Beschreibungen der durchzuführenden Validierungslogiken zurückliefert, vor.

public class HamsterFarbeValidationAttribute : 
                       ValidationAttribute, IClientValidatable
{
    protected override ValidationResult IsValid(
                           object value, 
                           ValidationContext validationContext)
    {
        Hamster h = validationContext.ObjectInstance as Hamster;

        string farbe = value.ToString();

        if (h.Name == "Krümel" && farbe != "gold")
        {
            string msg = "Krümel ist doch ein Goldhamster!";
            return
                new ValidationResult(msg);

            // für weitere Infos siehe [Nils Holgersson]
        }
        return ValidationResult.Success;
    }

    // Client-seitige Validierung
    public IEnumerable<ModelClientValidationRule>
             GetClientValidationRules(
                   ModelMetadata metadata, 
                   ControllerContext context)
    {
        string msg = "Krümel ist doch ein Goldhamster!";

        var rule = new ModelClientValidationRule
        {
            ErrorMessage = msg,
            ValidationType = "hamsterfarbe"
        };
            
        rule.ValidationParameters.Add("casesensitive", "false");
        
            

        // Für weitere Infos siehe [Nils Holgersson]

        yield return rule;
    }

}

Um das Validierungsattribut nun anzuwenden, wird die zu validierende Eigenschaft damit annotiert.

public class Hamster
{
    public int Id { get; set; }
    public string Name { get; set; }

    [HamsterFarbeValidation]
    public string Farbe { get; set; }
  
}

Nun muss noch das HTML-Markup um die clientseitigen Validierungslogiken erweitert werden. Dazu sind zwei Schritte nötig: Zum einen muss die Validierungsmethode an sich bereitgestellt werden und zum anderen muss ein Adapter, welcher die von ASP.NET MVC generierten HTML 5-Attribute auf diese Validierungsmethode mappt, erstellt werden. Ersteres wird im nachfolgenden Listing mit der Methode $.validator.addMethod bewerkstelligt; letzteres mit $.validator.unobtrusive.adapters.addBool. Der String hamsterfarbe, welcher übrigens nur aus Kleinbuchstaben bestehen darf, benennt die in Form einer Validierungsregel hinzugefügte Validierungslogik; der selbe String in der zweiten Methode den Adapters. Herrscht hier, wie im betrachtenten Beispiel, Namensgleicheit, wird der Adapter mit der Validierungsregel verbunden. Ansonsten müsste der Name der Validierungsregel im zweiten optionalen Parameter an die Methode addBool übergeben werden.

$.validator.addMethod(
    "hamsterfarbe",
    function (value, element) {

        value = value.toLowerCase();

        if ($("#Name").val() == "Krümel" 
             && value != "gold") return false;

        return true;
    });

$.validator.unobtrusive.adapters.addBool("hamsterfarbe");

Die restliche Seite gestaltet sich wie gewohnt, wobei durch Verwendung der Methode ValidationMessageFor oder ValidationMessage eventuelle Fehlermeldungen auszugeben sind (siehe nachfolgendes Listing).

<div class="editor-label">
    @Html.LabelFor(model => model.Farbe)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Farbe)
    @Html.ValidationMessageFor(model => model.Farbe)
</div>

Wird die Seite nun ausgeführt, kommt man in den Genuss der benutzerdefinierten Validierung via JavaScript:

Die jQuery-Methode addBool ist übrigens die einfachste Methode, um Adaptoren bereitzustellen. Weitere Möglichkeiten werden im nächsten Teil dieser Artikel-Serie besprochen.

 


Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

31.01.2011 13:18:49
@writeline Ja, stimmt. Danke Dir! Die Verlosung http://www.it-visions.de/LESER/Gewinnspiel.aspx läuft bis 7.2. :-)
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Verlosung: Kostenfreie Teilnahme an der BASTA Spring

31.01.2011 11:54:03
Unter den Lesern seiner Bücher verlost der Dotnet-Doktor eine kostenfreie Teilnahme für die BASTA Spring vom 22. bis 24. Februar im Wert von 1049 Euro.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

31.01.2011 10:59:29
@writeline: Danke... aber ich sehe keinen. Hilf mir bitte :-)
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

31.01.2011 10:36:04
Unter den Lesern meiner Bücher verlose ich eine kostenfreie Teilnahme an der BASTA Spring 2011 im Wert von 1049 Euro: http://bit.ly/g77ZFf
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

27.01.2011 19:38:18
Noch eine .NET-Konferenz in Deutschland: .NET DevCon 6.+7.6. in Nürnberg. Call for Papers noch bis 15.2.: http://www.heise.de/-1178548.html
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

.NET DevCon – noch eine .NET-Konferenz im Deutschland

27.01.2011 16:05:26
Neben BASTA, VSOne, ADC und prio.conference findet am 6. und 7. Juni 2011 erstmals die .NET DevCon statt. Das wirft einige Fragen auf. Der Dotnet-Doktor mit Fragen an Ausrichter Tilman Börner.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

27.01.2011 14:49:52
Neue Website: http://www.powershell.de - bundesweite PowerShell-Kurse mit Dr. Tobias Weltner, Peter Monadjemi und Dr. Holger Schwichtenberg
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

20.01.2011 10:34:31
Blogged: ADO.NET Entity Framework: Objekte anhand des PK löschen, ohne sie vorher komplett zu laden: http://www.heise.de/-1164127.html
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tipp für ADO.NET Entity Framework: Objekte löschen, ohne sie zu laden

17.01.2011 11:53:32
DeleteObject() setzt voraus, dass man das Objekt vorher schon geladen hat. Das kann extrem ineffizient sein, wenn man ein Objekt löschen will, dessen Primärschlüssel man kennt, aber bisher nicht geladen wurde.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

16.01.2011 12:59:50
Sa, 22.01.2011: Ganztätige Vorlesung über die #PowerShell 2.0 an der Fachhochschule Campus 02 in Graz: http://www.it-visions.de/v5975.aspx
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

MVC 3: Mit Scaffolding Websites generieren

14.01.2011 01:10:00

Microsoft stellt nun neben der finalen Version von ASP.NET MVC 3 über NuGet, welches Bestandteil von Version 3 ist, eine BETA des MvcScaffolding packages zur Verfügung. Mit diesem kann ein Grundgerüst für eine datengetriebene WebSite aus Model-Klassen generiert werden. Dieses beinhaltet einen Controller mit CRUD-Methoden, eine View, einen DbContext für die Verwendung mit EF Code Only sowie - auf Wunsch - ein Repository (Data Access Object), welches das EF kapselt. Im Hintergrund basiert die Codegenerierung auf T4 und kann somit angepasst werden. Um zum Beispiel all diese Artefakte für eine Modell-Klasse Hamster erstellen zu lassen, wird die nachfolgende Anweisung in der Package Manager Console von NuGet abgesetzt:

   Scaffold Controller Hamster -Repository -Force

Weitere Infos gibt es unter [1] und [2].

[1] http://blog.stevensanderson.com/2011/01/13/scaffold-your-aspnet-mvc-3-project-with-the-mvcscaffolding-package/
[2] http://blog.stevensanderson.com/2011/01/13/mvcscaffolding-standard-usage/


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

ASP.NET MVC 3 und AJAX: Remotevalidierung mit jQuery

11.01.2011 23:57:00

Einige Validierungen können ausschließlich Server-seitig erfolgen. Ein Beispiel dafür ist eine Prüfung gegen bestimmte Datensätze in einer Datenbank. Damit diese Validierungen auch bereits am Client vor dem Absenden der Daten erfolgen können, bietet ASP.NET MVC 3 die Möglichkeit, sie via AJAX anzustoßen. Im Hintergrund kommt dabei jQuery zum Einsatz.

Um von dieser Möglichkeit Gebrauch zu machen, wird zunächst eine Action-Methode, welche den zu validierenden Wert entgegennimmt, bereitgestellt. Optional kann diese Methode auch noch weitere Werte, die gemeinsam mit dem zu validierenden Wert erfasst werden, erwarten. Diese Action-Methode führt die Validierung durch und liefert je nachdem, ob die Validierung erfolgreich war oder nicht, true oder false in Form von JSON retour.

public ActionResult ValidateTitle(string title, string text)
{
    if (title == null) title = "";
    if (text == null) text = "";

    if (title == "Unknown Title") 
           return Json(false, JsonRequestBehavior.AllowGet);

    if (text == title) 
           return Json(false, JsonRequestBehavior.AllowGet); ;
            
    return Json(true, JsonRequestBehavior.AllowGet);;
}

Anschließend kann das zu validierende Feld mit Remote annotiert werden. Im betrachteten Fall werden der Name der Action-Methode sowie der Name des Controllers übergeben. Alternativ dazu erlauben weitere Überladungen die Übergabe eines Routennamens. Zusätzlich wird die im Falle einer fehlgeschlagenen Validierung anzuzeigende Fehlermeldung, die zu verwendende HTTP-Methode und eventuelle weitere Felder, die an die Validierungsmethode zu übermitteln sind, übergeben. Letzteres funktioniert im RC 2 anscheinend (noch) nicht. 

public class News
{
    [Remote("ValidateTitle", "News", 
            ErrorMessage = "Titel ist ungültig!", 
            HttpMethod = "POST", 
            AdditionalFields= "Text")]
    public string Title { get; set; }

    [AllowHtml]
    public string Text { get; set; }
}

 


Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

07.01.2011 09:17:56
.NET-Jahresrückblick 2010 - Die Ereignisse in der ".NET-Welt" des letzten Jahres: http://www.heise.de/-1164101.html
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Das war das .NET-Jahr 2010 – ein Rückblick

07.01.2011 08:52:01
Ein Rückblick auf die Ereignisse und Entwicklung bei Microsofts .NET im letzten Jahr.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Tweet von DOTNETDOKTOR

05.01.2011 15:51:02
Windows PowerShell 2.0-Seminare von iX und IT-Visions. Jetzt neue Termine für 2011: http://www.ix-konferenz.de/konf.php?konferenzid=139
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Azure: Automatisches Skalieren - Beispiel

02.01.2011 20:33:00

Holger Sirtl von Microsoft Deutschland hat hier [1] einen netten Blog-Eintrag verfasst, welcher beschreibt, wie man eine Azure-Anwendung mit ein paar Zeilen Code dazu bringen kann, nach gewissen Regeln automatisch mehr Instanzen anzufordern.

[1] http://blogs.msdn.com/b/hsirtl/archive/ ... itung.aspx


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Azure SDK 1.3: SEHException beim Lesen der Role-Konfiguration via RoleManager. GetConfigurationSetting

02.01.2011 03:37:00

Seit ich auf Azure SDK 1.3 umgestellt habe, habe ich beim Lesen der Role-Konfiguration mittels RoleManager.GetConfigurationSetting eine SEHException bekommen. Der Grund war, dass ich vor einiger Zeit festgelegt habe, dass mein IIS (64 Bit) auch 32 Bit-Prozesse ausführen darf. Damit kommt das SDK 1.3 beim Ausführen von Web-Applikationen in der Dev-Fabric offensichtlich nicht klar [1].

Lösung 1: 32 Bit-Unterstützung deaktivieren
Dazu ist die folgende Anweisung als Admin auf der Konsole auszuführen:
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.enable32BitAppOnWin64:false

Lösung 2: Die Verwendung von IIS durch die Dev-Fabric deaktivieren
Dazu ist das XML-Element Sites inkl. aller Unterelemente in der ServiceDefinition.csdef für die Arbeit mit der Dev-Fabric auszukommentieren.

[1] http://social.msdn.microsoft.com/Forums ... cb20b38c1d


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Azure: Communication Object Faulted Exception was unhandled

01.01.2011 04:15:00

Bei der Arbeit mit Azure trat plötzlich beim Starten des Web-Projekts die Fehlermeldung CommunicationObjectFaultedException was unhandled auf. Es hat sich dann herausgestellt, dass ab Azure SDK 1.3 die web.config nicht schreibgeschützt sein darf [1, 2], was bei nicht ausgecheckten Dateien jedoch der Fall ist. Lösung: Datei auschecken und Solution starten. Mehr dazu findet sich unter [3].

[1] http://social.msdn.microsoft.com/Forums ... 52abfe2a9e

[2] http://code-inside.de/blog/2010/12/03/f ... ted-state/

[3] http://blogs.msdn.com/b/windowsazure/ar ... -core.aspx


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Biz Talk Server Adapter-Pack auf 64-Bit-System

31.12.2010 01:48:00

Damit das Adapter-Pack, das ab BizTalk 2010 sich im Lieferumfang befindet, auf einem 64-Bit-System funktioniert, muss anscheinend auch dessen 32-Bit-Gegenstück installiert werden [1]. Die nachfolgend dargestellte Installationsreihenfolge, welche unter [1] vorgeschlagen wird, hat bei mir funktioniert:

1.64-bit WCF LOB Adapter SDK SP2
2.64-bit BizTalk Adapter Pack.
3.32-bit BizTalk Adapter Pack.

[1] http://geekswithblogs.net/bosuch/archiv ... -this.aspx


Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

".NET 4.0 Crashkurs" erschienen

17.12.2010 11:28:43
Komprimiertes Wissen zu .NET 4.0 und Visual Studio 2010 bietet das Standardwerk für Umsteiger von Java, C++, Visual Basic 6, Delphi & Co.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

LightSwitch: iX-Artikel und BASTA-Interview

13.12.2010 13:34:00
Neben einem Beitrag in der aktuellen iX ist die Meinung des DOTNET DOKTORS zu Visual Studio LightSwitch auch in einem Videointerview auf der letzten BASTA zu sehen.
Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Ankündigung von Silverlight 5 sollte für Beruhigung sorgen

03.12.2010 15:10:11
Der Dotnet-Doktor freut sich auf die Verbesserungen für Geschäftsanwendungen, insbesondere die bessere Unterstützung für Model-View-ViewModel (MVVM).
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

ASP.NET MVC 3: Vereinfachte clientseitige Validierung mit Validierungsattributen und jQuery

29.11.2010 11:39:00

Achtung: Dieser Beitrag geht davon aus, dass die ab der finalen Version von ASP.NET MVC 3 standardmäßig verwendete "unobstrusive" Validation NICHT verwendet wird. Falls dies doch der Fall ist (was in den meisten Fällen sinnvoll sein dürfte), weicht die Vorgehensweise von der hier beschriebenen etwas ab. Informationen dazu finden sich hier.

Zur Verbesserung der Benutzerfreundlichkeit erlaubt ASP.NET MVC das Bereitstellen von clientseitigen auf JavaScript basierenden Validierungsroutinen, die ergänzend zur serverseitigen Validierung ausgeführt werden. Durch Unterstützung des Interfaces IClientValidatable wird solch ein Vorhaben ab Version 3 erleichtert.

Das nachfolgende Listing demonstriert die Verwendung dieses Interfaces. Es zeigt ein Validierungsattribut, das IClientValidatable und damit auch dessen Methode GetClientValidationRules implementiert. Die Aufgabe dieser Methode besteht im Bereitstellen von ModelClientValidationRule-Instanzen, wobei jede dieser Instanzen eine auszuführende javascript-basierte Validierungs-Routine beschreibt. Im betrachteten Beispiel wird eine solche Instanz, die auf die Methode HamsterFarbe verweist, zurückgeliefert. Zusätzlich wird eine Fehlermeldung (ErrorMessage) sowie ein Wert für den benutzerdefinierten Parameter autocorrect hinterlegt.

public class HamsterFarbeValidationAttribute : ValidationAttribute, IClientValidatable
{
    // Client-seitige Validierung
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = "Aber Krümel ist doch ein Goldhamster !!!",
            ValidationType = "HamsterFarbe"
        };
        rule.ValidationParameters.Add("autocorrect", true);
    
         // Für weitere Infos siehe Nils Holgersson

        yield return rule;
    }

    [...]

In den zu validierenden Views sind, wie nachfolgend gezeigt, zusätzlich die entsprechenden JavaScript-Libraries einzubinden. Daneben wird im Dictionary Sys.Mvc.ValidatorRegistry.validators unter dem im Validierungs-Attribut definierten Namen eine JavaScript-Methode hinterlegt. Diese nimmt ein JavaScript-Gegenstück der jeweiligen ModelClientValidationRule-Instanz entgegen und liefert eine dazu passende Validierungsfunktion zurück. Es handelt sich somit um eine Funktion, die eine Validierungsfunktion liefert. Zusätzlich ist die clientseitige Validierung, wie bereits in der Vorgängerversion, durch einen Aufruf der Methode Html.EnableClientValidation zu aktivieren.

<script src="../../Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript">
</script>
<script type="text/javascript" src="../../Scripts/MicrosoftAjax.debug.js">
</script>
<script type="text/javascript" src="../../Scripts/MicrosoftMvcValidation.debug.js">
</script>

<script type="text/javascript">
    // Funktion HamsterFarbe
    Sys.Mvc.ValidatorRegistry.validators["HamsterFarbe"] = function (rule) {
        var autocorrect = rule.ValidationParameters["autocorrect"];
        // Zurückgeliefert wird die zu verwendende Validierungs-Funktion
        return function (value, context) {
            var name = $("#Spitzname").val();
            var info = "";
            if (name == "Krümel" && value != 1) {
                if (autocorrect) {
                    $("#FarbeId").val(1);
                    info = "\nDer Wert wurde automatisch korrigiert!";
                }
                return rule.ErrorMessage + info;
            }
            return true;
        };
    };
</script>
@{ Html.EnableClientValidation(); }

Wird das Validierungsattribut nun, wie im nachfolgenden Listing gezeigt, angewandt, kommt man in den Genuss einer client-seitigen Validierung, welche bekanntlich aus Sicherheitsgründen nur eine Ergänzung zu und kein Ersatz für entsprechende Server-seitige Validierungen darstellt.

class Hamster {
    [HamsterFarbeValidation]
    public int FarbeId { get; set; }
}


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Endlich: JSON-Binding in ASP.NET MVC 3 zum Senden von Objekten via AJAX

27.11.2010 00:58:00

Das Erzeugen von Ergebnissen in Form von JSON-Strings war bereits vor Version 3 möglich. Allerdings fehlte es an der Möglichkeit, einen über HTTP übertragenen JSON-String an Eingabeparameter zu binden. Für solche Szenarien musste selber Hand angelegt oder auf andere Frameworks, wie WCF, ausgewichen werden. Ab Version 3 ist dies nicht mehr notwendig, denn das Mappen von JSON-Strings auf Parameter wird nun ohne Umwege unterstützt.

Die Methode Div in Listing 1, welche ein DivRequest erwartet und ein DivResponse zurückliefert, kann somit via AJAX mit JSON angesprochen werden. In Listing 2 wird dies unter Verwendung von jQuery, einem weit verbreiteten freien JavaScript-Framework, das ab Visual Studio 2010 ausgeliefert wird, bewerkstelligt. Dazu kommt die Methode $.ajax zum Einsatz. Um das Objekt request, dessen Aufbau der Struktur von DivRequest entspricht, in einen JSON-String umzuwandeln, wird die über json.org bereitgestellte Methode JSON.stringify herangezogen. Damit dieses Vorhaben funktioniert, bedarf es noch einer zusätzlichen Zeile in der global.asax, welche eine Instanz von JsonValueProviderFactory bei ASP.NET AJAX registriert (Listing 3).

Listing 1

1:  [HttpPost]  
2:  public ActionResult Div(DivRequest req)  
3:  {  
4:      DivResponse response = new DivResponse();  
5:                
6:      response.Result = req.A / req.B;  
7:      response.Remainder = req.A % req.B;  
8:      return Json(response);  
9:  }

Listing 2

1:  <script type="text/javascript" src="../../Scripts/jquery-1.4.1-vsdoc.js"></script>  
2:  <script type="text/javascript" src="../../Scripts/json2.js"></script>  
3:     
4:  <script type="text/javascript">  
5:      $(function () {  
6:     
7:     
8:          $("#execDivLink").click(function () {  
9:    
10:              var request = { 
11:                  A: 10, 
12:                  B: 3 
13:              }; 
14:    
15:              var strRequest = JSON.stringify(request); 
16:    
17:              $.ajax({ 
18:                  type: "POST", 
19:                  url: "/Math/Div", 
20:                  data: strRequest, 
21:                  dataType: "json", 
22:                  contentType: "application/json", 
23:                  processData: false, 
24:                  success: function (data, status, req) { 
25:                      alert("Result: " + data.Result); 
26:                      alert("Remainder: " + data.Remainder); 
27:                  }, 
28:                  error: function (req, textStatus, errorThrown) { 
29:                      alert("Error: " + req.status); 
30:                  } 
31:              }); 
32:          }); 
33:      }); 
34:  </script> 
35:       
36:  <h2>Index</h2> 
37:    
38:  <p> 
39:      <a id="execDivLink" href="#">Dividiere 10 durch 3 ...</a> 
40:  </p>

Listing 3

1:  protected void Application_Start()  
2:  {  
3:      [...]  
4:     
5:      ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());  
6:  }


Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Heiter bis wolkig

22.11.2010 09:28:46
Bei den Neuigkeiten der PDC 2010 und der TechEd Europe 2010 ging es hauptsächlich um Cloud Computing.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Azure/C#-Beispiel: Konsistenz ohne Transaktionen mit NoSQL, BASE und Azure Storage Services

17.11.2010 16:26:00

Das nachfolgende Azure/C#-Beispielprojekt zeigt, wie man ohne Transaktionen mit den Azure Storage-Services (zeitlich verzögerte) Konsistenz sicherstellen kann. Demonstriert wird dies anhand zwei TableStorage-Entitäten, Profiles und Postings: Pro Profile (Benutzerprofil) kann es mehrere Postings geben, wobei das letzte Posting, sowie die Anzahl der Postings auch im Profil redundant gespeichert werden. Somit müssten eigentlich Transaktionen verwendet werden. Allerdings gibt es die in TableStorage, u. a. aus Skalierungsgründen (siehe mein letztes Posting), nicht.

Zeitlich verzögerte Konsistenz kann aber auch mit Hilfe von Message-Queues hergestellt werden. Zum einen wird eine Message mit den zu ändernden Einträgen in Profiles und Postings in eine Queue geschrieben. Da dies nur eine Anweisung benötigt, handelt es sich hierbei um eine atomare Aktion. Die Nachricht wird gelesen und die Änderungen werden durchgeführt.
Scheitert dies, so wird die Nachricht _nicht_ aus der Queue gelöscht und das System befindet sich nun in einem inkonsistenten Zustand. Allerdings wird dann die Nachricht nach einiger Zeit wieder gelesen und bearbeitet. Somit sollte, sofern es sich nicht um einen Software-Fehler handelt, irgendwann die beiden Tabellen aktualisiert und das System somit wieder konsistent werden.

Auf zwei Dinge muss geachtet werden:

- Die Aktionen müssen Idempotent sein
- Poison-Messages müssen erkannt werden

Updates sollten per se idempotent sein, sofern kein anderer zwischenfunkt. Letzteres wird aber durch optimitische Concurrency-Checks von den Table-Services verhindert. Inserts müssen als InsertOrUpdate oder InsertOrDoNothing implemeniert werden und die ID muss von Anfang an bekannt sein, um zu verhindern, dass sie doppelt vorkommen. Die Tatsache, ob die Anzahl der Postings im Profil bereits erfolgreich hochgezählt wurde, muss auch irgendwo vermerkt werden um ein mehrfaches hochzählen für ein Posting zu vermeiden. Dafür wird eine Spalte in der Entität Profiles verwendet.

Poison-Messages sind Nachrichten, die immer wieder zum Scheitern der damit assoziierten logischen Transaktion führen. Diese werden durch den Dequeue-Count erkannt, der pro Abrufen aus der Queue automatisch hochgezählt wird. Überschreitet dieser den Wert 10 wird die Nachricht nicht mehr bearbeitet, sondern in eine Poison-Queue verschoben.

http://www.softwarearchitekt.at/downloads/Twittr.zip


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

NoSQL, BASE und Windows Azure - Folien zu Vortrag auf CloudConf 2010 in Stuttgart

17.11.2010 16:23:32
Nachfolgend meine Folien zu meinem Vortrag über NoSQL, BASE und Windows Azure Storage Services, welchen ich auf der CloudConf 2010 in Stuttgart gehalten habe.

http://www.softwarearchitekt.at/downloa ... _Azure.pdf


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Azure AppFabric (ServiceBus und ACS): Folien CloudConf Stuttgart 2010

17.11.2010 16:20:54
Nachfolgend meine Folien zu meinem Vortrag über Azure AppFabric auf der CloudConf 2010 in Stuttgart.

http://www.softwarearchitekt.at/downloa ... Fabric.pdf


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

ASP.NET MVC 2 - Folien und Übungsblatt von BASTA on Tour 2010 in Hamburg

17.11.2010 15:52:00

Meine Folien und das Übungsblatt, welches ich bei meinem Workshop zu ASP.NET MVC 2 auf der BASTA! on Tour 2010 in Hamburg verwendet habe, sind nun hier zu finden:

http://www.softwarearchitekt.at/downloa ... VC_BOT.pdf
http://www.softwarearchitekt.at/downloa ... AM_LAB.pdf


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Scandinavian Developer Conference 2011

12.11.2010 23:02:33
Diese Woche habe ich die Zusage für zwei Sessions auf der Scandinavian Developer Conference 2011, die im April in Göteborg stattfindet, bekommen.



Nachfolgend die Abstracts meiner Sessions:

By by relational database and ACID-transactions: An introduction into BASE and NoSQL by the example Windows Azure Storage Services

In view of scalability and availability, huge companies like Amazon, Google or eBay don’t use relational databases for their web-applications anymore. Instead of that and instead of ACID-transactions, they use approaches like NoSQL (Not only SQL) and BASE, which stands for basically available, soft state, eventually consistent. This session shows why those concepts improve scalability and availability and how to use them in practice by an sample implemented with Windows Azure Storage Services.

Finding bugs before your customer does - Code Contracts in .NET 4.0

Code Contracts, included in .NET 4.0, is an implementation of a concept called Design by Contract which aims to creating more stable applications. This session shows how one can profit by these features. For this purpose, the session starts with a presentation of a simple C#-application which seems to be stable at first glance. During the session, some not obvious but grave bugs which could have been avoided using Code Contracts will be found and discussed.

Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Breaking Changes in Windows Azure Oktober CTP

06.11.2010 02:05:01
Die Oktober CTP von Windows Azure bringt einige 'Breaking Changes' mit sich. Der wohl gravierenste dürfte sein, dass vor der Kommunikation mit dem Windows Azure Service Bus sogenannte Connection Points [1] angelegt werden müssen. In früheren Versionen konnte ja, sofern man die entsprechenden Berechtigungen hatte, einfach frisch fröhlich unter Verwendung einer noch freien URL im jeweiligen Namensraum kommuniziert werden.

Abseits davon, sind Message-Buffer nun bestätig (Durable Message-Buffer) und für Services steht ein Load-Balancing-Mechanismus zur Verfügung. Weitere Infos finden sich unter [2]

[1] http://blogs.msdn.com/b/willpe/archive/ ... oints.aspx

[2] http://msdn.microsoft.com/en-us/library/gg278340.aspx

Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Steve Ballmer live aus Redmond

28.10.2010 12:13:55
Erstmals kann man ohne Registrierung alle Vorträge von Microsofts PDC im Internet sehen.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Langlaufende Transaktionen (Sagas) in NServiceBus anhand eines Beispiels

24.10.2010 01:56:00

NserviceBus unterstützt mit dem Konzept der Saga langlaufende Transaktionen. Dieses Konzept soll hier anhand des Beispiels Ansuchen und Bearbeiten von Anforderungen, welches hier zum Download bereit steht, beschrieben werden. Im ersten Schritt sucht ein Mitarbeiter um ein Produkt an. Der jeweilige Vorgesetzte erhält eine Nachricht und hat nun die Aufgabe, das Ansuchen zu bearbeiten, also zu genehmigen oder abzulehnen.

Dabei ergeben sich zwei technische Aufgaben: Zum einen muss die Nachricht mit der Entscheidung des Vorgesetzten zu einer der aktiven Sagas zugeordnet werden, damit das System den richtigen Bedarfsträger über diese Entscheidung informiert bzw. die richtigen Produkte bestellt. Zum anderen müssen Zustandsinformationen über die Saga bei jedem mit ihr assoziierten Methodenaufruf geladen bzw. danach wieder gesichert werden. Diese Zustandsinformationen könnten im betrachteten Beispiel die Id, den Namen sowie die Email-Adresse des Mitarbeiters sowie Informationen über die im Falle einer Genehmigung zu bestellenden Produkte beinhalten. Glücklicherweise kümmert sich NServiceBus um diese beiden Aufgaben.

Um mit NServiceBus eine Saga zu implementieren, sind zunächst Klassen für die Nachrichten sowie eine Klasse, welche den Zustand einer Saga repräsentiert, zu erstellen. Die Nachrichtenklassen implementieren per Definition IMessage; die Klasse mit den Zustandsinformationen ISageEntity (siehe Listing 1). Bei IMessage handelt es sich um ein Marker-Interface; ISageEntity gibt hingegen die Eigenschaften Id, OriginalMessageId und Originator vor, welche NServiceBus-intern Verwendung finden.

Listing 1: Nachrichtenklassen und Saga-Entität
   1:  public class Request : IMessage
   2:  {
   3:      public Request()
   4:      {
   5:          Id = Guid.NewGuid().ToString();
   6:      }
   7:  
   8:      public String Id { get; set; }
   9:      public String ProductName { get; set; }
  10:      public double Price { get; set; }
  11:  }
  12:  
  13:  public class Decision : IMessage
  14:  {
  15:      public String RequestId { get; set; }
  16:      public bool Approved { get; set; }
  17:  }
  18:  
  19:  public class RequestSagaData : ISagaEntity  
  20:  {
  21:      public virtual String RequestId { get; set; }
  22:      public virtual DateTime? RequestDate { get; set; }
  23:      public virtual bool? Approved { get; set; }
  24:      public virtual DateTime? DecisionDate { get; set; }
  25:  
  26:      public virtual String ProductName { get; set; }
  27:      public virtual double Price { get; set; }
  28:  
  29:  
  30:      public virtual Guid Id
  31:      {
  32:          get;
  33:          set;
  34:      }
  35:  
  36:      public virtual string OriginalMessageId
  37:      {
  38:          get;
  39:          set;
  40:      }
  41:  
  42:      public virtual string Originator
  43:      {
  44:          get;
  45:          set;
  46:      }
  47:  }


Zur Behandlung der einzelnen innerhalb der Saga erwarteten Nachrichten, wird eine Subklasse von Saga bereitgestellt (Listing 2). Dabei ist Saga mit der zu verwendeten SagaEntity-Implementierung zu typisieren. Über die von dieser Klasse geerbte Methode ConfigureHowToFindSaga wird festgelegt, wie Folgenachrichten zu bereits laufenden Sagas zugewiesen werden sollen. Im betrachteten Beispiel wird festgelegt, dass zu diesem Zwecke die RequestId von Decision mit der in den Zustandsinformationen der Saga gespeicherten RequestId zu vergleichen ist. Bei Gleichheit wird die Nachricht mit der jeweiligen Saga assoziiert.

Für jede zu behandelnde Nachrichten ist darüber hinaus ISagaStartedBy<T> oder IHandleMessage<T> zu implementieren, wobei diese mit der jeweiligen Nachrichtenklasse zu typisieren sind. Mit ISagaStartedBy wird angezeigt, dass eine neue Saga bei Empfang einer durch den Typparameter repräsentierten Nachricht gestartet wird. Im Gegensatz dazu muss bei Verwendung von IHandleMessage die jeweilige Saga bereits aktiv sein. Beide Interfaces geben die Methode Handle(T) vor, deren Aufgabe das Behandeln der jeweiligen Nachrichten ist. Über die Eigenschaft Data, welche den Typ der festgelegten SagaEntity aufweist, kann auf die Zustandsinformationen der Saga zugegriffen werden. Zum Laden und Speichern dieser Informationen verwendet NServiceBus den O/R-Mapper NHibernate. Ein Zutun des Entwicklers ist hierbei nicht von Nöten. Beendet eine Handle-Implementierung die Saga, ruft diese per Definition die Methode MarkAsComplete auf. Dies führt dazu, dass die Zustandsinformationen aus der mit NHibernate eingebundenen Datenbank gelöscht werden.


Listing 2: Message-Handler
   1:  class RequestSaga: 
   2:      Saga<RequestSagaData>,
   3:      ISagaStartedBy<Request>,
   4:      IHandleMessages<Decision>
   5:  {
   6:      public override void ConfigureHowToFindSaga()
   7:      {
   8:          this.ConfigureMapping<Decision>(
   9:              saga => saga.RequestId,
  10:              decision => decision.RequestId);
  11:  
  12:      }
  13:  
  14:      public void Handle(Request message)
  15:      {
  16:          Console.WriteLine("GOT REQUEST:");
  17:          Console.WriteLine("Message Id: " + message.Id);
  18:          Console.WriteLine("Product Name:" + message.ProductName);
  19:          Console.WriteLine("Price: " + message.Price);
  20:          Console.WriteLine();
  21:  
  22:          this.Data.ProductName = message.ProductName;
  23:          this.Data.Price = message.Price;
  24:  
  25:          Data.RequestDate = DateTime.Now;
  26:          Data.RequestId = message.Id;
  27:  
  28:             
  29:      }
  30:  
  31:      private static void SaveHotel()
  32:      {
  33:          using (var s = HibernateHelper.OpenSession())
  34:          {
  35:              using (var t = new TransactionScope())
  36:              {
  37:                  Hotel h;
  38:                  h = new Hotel
  39:                  {
  40:                      Bezeichnung = "Hotel zum großen Test",
  41:                      Sterne = 4
  42:                  };
  43:                  s.Save(h);
  44:                  t.Complete();
  45:              }
  46:          }
  47:      }
  48:  
  49:      public void Handle(Decision message)
  50:      {
  51:          Console.WriteLine("GOT DECISION:");
  52:          Console.WriteLine("Message Id: " + message.RequestId);
  53:          Console.WriteLine("Product Name:" + Data.ProductName );
  54:          Console.WriteLine("Price: " + Data.Price);
  55:          Console.WriteLine("Approved: " + message.Approved);
  56:          Console.WriteLine();
  57:  
  58:          Data.Approved = message.Approved;
  59:          Data.DecisionDate = DateTime.Now;
  60:  
  61:          SaveHotel();
  62:  
  63: 
  64:  
  65:          this.MarkAsComplete();
  66:             
  67:      }
  68:  }


Damit die gezeigten Sagas zur Ausführung gebracht werden können, wurde NServiceBus mit den Methoden Sagas und NHibernateSagaPersister konfiguriert (Listing 3). Erstere Aktiviert die Unterstützung für Sagas; letztere aktiviert den SagaPersister, welche die Zustände mit Hilfe von NHibernate in einer Datenbank speichert.

Listing 3: Konfigurieren von NServiceBus
   1:  static void Main(string[] args)
   2:  {
   3:      Configure  
   4:          .With()  
   5:          .Log4Net()
   6:          .DefaultBuilder()
   7:          .XmlSerializer()  
   8:          .MsmqTransport()  
   9:          .IsTransactional(true)  
  10:          .PurgeOnStartup(false)  
  11:          .UnicastBus()  
  12:          .LoadMessageHandlers()  
  13:          .ImpersonateSender(false)  
  14:          .Sagas() 
  15:          .NHibernateSagaPersister()
  16:          .CreateBus()  
  17:          .Start();
  18:             
  19:      Console.ReadLine();
  20:  }
  21:  
  22:  [...]
  23:  


Darüber hinaus wurden Konfigurationsdaten für den SagaPersister in der Konfiguration abgelegt (Listing 4).

Listing 4: Konfiguration des SagaPersisters
   1:    <NHibernateSagaPersisterConfig>
   2:      <NHibernateProperties>
   3:       
   4:        <add Key="connection.provider"
   5:             Value="NHibernate.Connection.DriverConnectionProvider"/>
   6:        <add Key="connection.driver_class"
   7:             Value="NHibernate.Driver.SqlClientDriver"/>
   8:        <add Key="connection.connection_string"
   9:             Value="Server=[…];initial catalog=[…];Integrated Security=SSPI"/>
  10:        <add Key="dialect"
  11:             Value="NHibernate.Dialect.MsSql2005Dialect"/>
  12:      </NHibernateProperties>
  13:    </NHibernateSagaPersisterConfig>

 


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Speaker auf CloudConf 2010 in Stuttgart

20.10.2010 00:22:26
Im November habe ich die Ehre, auf der CloudConf in Stuttgard zu sprechen. Im Talk NoSQL und BASE in der Cloud: Die Table-, Blob- und Queue Services von Windows Azure werde ich aufzeigen, warum wir uns vor dem Hintergrund hochgradig skalierbarer Cloud-Lösungen von liebgewonnenen Konzepten, wie ACID-Transaktionen und relationalen Datenbanken, trennen müssen sowie welche Alternativen dazu, u. a. von Unternehmen wie Amazon oder Google, entwickelt wurden und wie damit umzugehen ist. Diese Ausführungen werde ich mit Beispielen aus Windows Azure verdeutlichen, wobei sie jedoch allgemein gültig sind.

Im Talk Service Bus in der Cloud: Unternehmensübergreifende Geschäftsprozesse und Cloud Computing geht es um Windows Azure AppFabric und die damit zur Verfügung gestellten Möglichkeiten für unternehmensübergreifende Geschäftsapplikationen.


Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Kostenloser Vortrag: Die Highlights in .NET 4.0 und Visual Studio 2010

19.10.2010 10:23:42
Am 27. Oktober hält der Dotnet-Doktor in Ratingen (bei Düsseldorf) einen zweistündigen Vortrag zu den Neuerungen in .NET 4.0 und Visual Studio 2010. Die Teilnahme ist kostenfrei.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Codequalität mit Code Contracts (.NET 4) - Mein MSDN-Webcast ist nun online

09.10.2010 08:44:00

Mein MSDN-Webcast zu Codequalität mit Code Contracts (.NET 4) ist nun online. In diesem Webcast zeige ich anhand eines Beispiels, wie man mit Code Contracts im Zuge des Kompilierens nicht offensichtliche Fehler finden kann. Darüber hinaus gehe ich auf weitere Aspekte, wie Vererbung und abstrakte Klassen/ Interfaces, ein.

http://www.microsoft.com/germany/msdn/w ... 1032465783


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Eindrücke vom 3. internationalem SOA-Symposium 2010 in Berlin

07.10.2010 16:04:00



Meine Session über SOA und BPM mit .NET 4, die ich gestern am SOA-Symposium in Berlin gehalten habe, hat echt gut funktioniert. Nachfolgend hänge ich noch ein paar Eindrücke von der Konferenz in Form von Fotos an.










Details

Dr. Holger Schwichtenberg,  Dr. Holger Schwichtenberg

Buch ".NET 4.0 Update" erschienen

05.10.2010 13:33:57
Das Buch stellt die zentralen Neuerungen in .NET 4.0 und Visual Studio 2010 vor.
Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

3. Internationales SOA-Symposium in Berlin: Mein Talk zu BPM und SOA mit der .NET-Plattform

01.10.2010 00:05:00

Nächste Woche habe ich die Ehre, beim 3. internationalen SOA-Symposium, welches dieses Mal in Berlin stattfinden wird, über BPM und SOA mit der .NET-Plattform zu sprechen.

Die Konferenz findet am DI, 5. 10. und MI, 6. 10. 2010 statt und gliedert sich in neun (!) parallele Tracks.

Weitere Infos zu meinem Talk finden sich hier. Die Unterlagen werde ich noch in diesem Blog posten...


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

BASTA! 2010: Beispiele und Fotos zur Session über NHibernate vs. Entity Framework (#bastacon)

23.09.2010 18:12:00

Wie in der Session besprochen, finden sich nachfolgend die in der Session verwendeten Beispiele.

http://www.softwarearchitekt.at/downloads/EF-vs-NH.zip

Ausserdem hab ich auch ein paar Fotos mit meinem iPhone gemacht.










Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

BASTA! 2010: Folien zur Session NHibernate vs. Entity Framework (#bastacon)

23.09.2010 14:34:00

Nachfolgend der Link zu meinen Folien von der Session NHibernate vs. Entity Framework:

http://www.softwarearchitekt.at/downloads/EF-vs-NH.pdf


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

BASTA! 2010: Folien und Foto zur Code Contracts-Session online (#bastacon)

22.09.2010 20:02:00

Nachfolgend meine Unterlagen von meiner Code-Contracts Session sowie ein Foto.

http://www.softwarearchitekt.at/downloa ... tracts.pdf

Linke Hälfte des Auditoriums:


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

.NET 4 Update auf Platz 1 bei amazon

21.09.2010 21:59:00

Cooles Gefühl: Vor einigen Tagen war unser Buch .NET 4 Update bei Amazon in der Kategorie .NET auf Platz 1 ...



http://www.amazon.de/NET-4-0-Update-Hol ... amp;sr=8-1


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

BASTA! 2010: Folien zur Session über Parallel-Programmierung mit .NET 4 (#bastacon)

21.09.2010 11:37:00

Nachfolgend die Unterlagen für meine Session zu Parallel-Programmierung mit .NET 4 (TPL etc.).

http://www.softwarearchitekt.at/downloa ... rallel.pdf


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

BASTA 2010: Agiles Requirements Engineering

20.09.2010 09:58:07
In wenigen Minuten startet mein Vortrag zu agilem Requirements Engineering. Deswegen poste ich hier mal die Unterlagen dafür:

Folien
Beispiele für Use Cases der drei Zielebenen


Details

FH-Prof. Manfred Steyer,  FH-Prof. Manfred Steyer

Hinterhof-Performancevergleich: Entity Framework vs. NHibernate

16.09.2010 15:16:00

In Hinblick auf meine Session auf der BASTA! habe ich einen kleinen Hinterhof-Performancevergleich zwischen NHibernate und Entity Framework durchgeführt. Dazu habe ich jeweils 10, 100 und 1000 Objekte eingefügt bzw. abgerufen. Die Ergebnisse korrelieren mit einem weiteren Hinterhof-Benchmark, der von jemanden in meinem Umfeld vor einiger Zeit durchgeführt wurde.

Wie man sieht, ist bei kleinen Datenmengen der Performanceunterschied vernachlässigbar.

Nachfolgend die Ergebnisse:

AktionObjekteZeit EF (ms)  Zeit NH (ms)
INSERT 10 45 45
INSERT 100 333 445
INSERT 1000 3157 4383
SELECT 10 81 67
SELECT 100 652 580
SELECT 1000 6406 10325

Details