.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv März 2011

xtopia[kompakt] Roadshow 2011 – Die finale Agenda

31.03.2011 12:26:00 | Peter Kirchner

Xtopia-kompakt-Logo-schwarz 11 b

Nur noch 5 Wochen bis zum ersten Halt der xtopia[kompakt] Roadshow 2011. Das ganze xtopia-Team freut sich schon ungemein auf die sechs Stationen in Deutschland. Die Agenda steht nun komplett und es erwartet Sie eine Fülle an brandneuen Themen direkt von der MIX in Las Vegas sowie viele hilfreiche Tipps und Tricks rund um das Design und die Entwicklung von Client-, Web-, und Phone Anwendungen.

Jetzt heißt es wirklich schnell sein und einen der begehrten Plätze sichern.

Jetzt anmelden auf www.xtopia.de

Der Blick auf die Agenda:

image

Die Sessions:

Styleguide vs. Brand vs. User Experience?
Neue Geräte bringen oft neue User Interfaces mit sich… auch gelten auf unterschiedlichen Gerättypen unterschiedliche Styleguides, also Designregeln. Diese Guides sind sehr informativ wenn man wissen muss, was im UI erlaubt ist und wo die Freiheitsgrade im Design liegen. Ein Styleguide soll auf der anderen Seite aber auch das einheitliche Erlebnis über das ganze Gerät hinweg sicherstellen. Nun reibt sich dieser Anspruch nicht selten mit Aspekten der Markenpräsentation, der „Brand“ und dem entsprechenden corporate design. Wie kann man solche auseinanderstrebende Anforderungen aufarbeiten und lösen?
Und damit noch nicht genug. Der treibende Anspruch für Applikationen auf den unterschiedlichen Geräten ist, eine exzellente User Experience zu ermöglichen, also eine Strategie zu formulieren, die sowohl die Anleitungen des Styleguides, die Anforderungen des Markenauftritts wie auch die Regeln der Usability erfüllen kann. Jetzt kann man sich in die Tasche lügen und behaupten, das „Branded Design“ ist an sich ja so toll, dass es sozusagen alles andere mitbringt. Oder man hängt der irren Idee an, dass ein sklavisches Befolgen des Styleguides automatisch eine gute User Experience erzeugen wird. Warum ist die Antwort auf die Frage „Ich habe aber nun eine App gebaut, warum kann ich das Design nicht einfach auf dem Computer verwenden?“ immer wieder sein muss: „Weil der Computer eben kein Handy ist!“.
Wir schauen uns diese Aspekte des modernen User Experience Design an und begeben uns auf die Suche nach den Lösungsansätzen für Styleguide + Brand + UX.
Wir interpretieren diese Aufgabe im Licht der neuen UI Strategien von Microsoft: Windows Phone 7 Metro Design, Microsoft NUI / Surface Computing und auch Kinect.

Webentwicklung mit der Microsoft Web Platform
Was ist eigentlich Webentwicklung? Im Grunde lässt sich diese Frage gar nicht so einfach beantworten. Statische Webseiten, ein eigener Blog, ein professionelles CMS, ein Shop-System, eine unternehmensweite Intranet-Applikation, ein Web-Forum, ein Wiki, Social Networks, Chats und vieles mehr. Ein Webentwickler muss heute in vielen Projekten die unterschiedlichsten Technologien beherrschen, immer mit dem Fokus auf die individuellen Voraussetzungen und Wünsche.
Die Microsoft Web Platform ermöglicht einem Webentwickler hier aus dem Vollen zu schöpfen.
In dieser Session zeigen Dariusz Parys und Tom Wendel in einer Demo-Extravaganza die unterschiedlichsten Microsoft Web-Technologien und wie mit ihnen in kürzester Zeit eine professionelle Webseite entsteht. WebMatrix, Razor, ASP.NET, PHP, Open Source Frameworks, Internet Explorer 9, Silverlight und vieles vieles mehr!

„Windows Phone 7 – The Next Generation”
Abstract: „Windows Phone 7 war das heiße Thema der xtopia[kompakt] 2010 und ist in der Entwickler- und Designercommunity begeistert aufgenommen worden. Und wir setzen alles daran, diese Erfolgsgeschichte in diesem Jahr fortzusetzen – mit einem umfassenden Paket wichtiger und fundamentaler neuer APIs und Tools, die coole Apps noch leichter realisierbar und neue Szenarien möglich machen. Informieren Sie sich also vor Ort aus erster Hand über das große Update, das 2011 neue Features wie IE9 und Multitasking auf Windows Phone bringen wird!“

Der Sprung nach vorn mit Windows 7
Sie möchten, dass Ihre Anwendung Eindruck hinterlässt? Und Sie möchten auch erreichen, dass Ihre Software nicht aufgrund von Oberflächlichkeiten aussortiert wird, bevor Ihre Kunden überzeugt sind, dass Sie ohne Ihre Lösung nicht mehr leben können? Dann sollten Sie auf diese "Oberflächlichkeiten" achten und die vielen Integrationsfeatures von Windows 7 kennen und nutzen, um Ihre Anwendung zeitgemäß aussehen zu lassen. Seien es so augenfällige Punkte wie die Taskbar, Sprunglisten und die Verwendung von Bibliotheken oder eher verborgene APIs, um den Netzwerk- und Powerstatus des Systems intelligent in Ihre Lösung zu integrieren und dabei gleichzeitig die vorhandenen Ressourcen wie CPU und Akku zu schonen. Anhand einer fiktiven Anwendung zur Verwaltung von Bildern gehen wir in diesem Vortrag gemeinsam den Prozess, eine Anwendung ohne viel Aufwand mittels der neusten Windows 7-Features zu modernisieren.

Aller Anfang ist leicht - Microsofts Unterstützung für alle Fälle
Damit sich niemand alleingelassen fühlt unterstützt Microsoft mit den Spark Programmen und dem MPR verschiedene Gruppen bei der Realisierung ihrer Projekte. In dieser Session wird erläutert, für wen welche Programmatik gedacht ist und wie man am besten loslegt.

Die Sprecher:

Clemens_1b_small dparys Frank Prengel
Clemens Lutsch
User Experience Evangelist 
Microsoft Deutschland GmbH
Dariusz Parys
Technical Strategist Web Platform
Microsoft Deutschland GmbH
Frank Prengel
Technical Evangelist
Microsoft Deutschland GmbH
Peter Kirchner TomWendel_200x300 Capturefile: N:\Archiv\6702\6702.-003.tif
CaptureSN: BQ020026.094422
Software: Capture One PRO for Windows
Peter Kirchner
Program Manager ISV 
Microsoft Deutschland GmbH
Tom Wendel
Developer Evangelist
Microsoft Deutschland GmbH
Sebastian Grassl
Web Development Product Marketing Manager
Microsoft Deutschland GmbH

2 Fragen in die Community!

31.03.2011 07:20:20 | Thorsten Hans

In der letzten Zeit wird in der Community etwas mehr über den TFS als ALM Werkzeug diskutiert.

Neben Jürgen, Ilker und Robert haben sich gerade auf Twitter viele Leute aus der Community in die Diskussion eingeschaltet und ihren Senf dazu gegeben. Ich selbst habe diese Diskussion etwas als Zuschauer verfolgt und einfach mal die unterschiedlichen Meinungen eingesammelt.

Meine Meinung zum Thema TFS ist einfach und kurz "In Sachen Integration kann TFS niemand das Wasser reichen!” – Wie auch? Ich selbst schaue aber auch über den Tellerrand und bin begeistert von Lösungen wie Mercurial – Kiln oder auch FogBugz! Dennoch muss ich sagen gefällt es mir besser, dass ich beim TFS eine zentrale Plattform habe und nicht x Tools zusammenstecken muss um meine ALM Bedürfnisse gedeckt zu bekommen.

Man sollte halt nur nicht blind durch die Welt laufen und auch mal nach links und rechts schauen.

Doch nun zum eigentlichen Thema – TeamBuild2010

Als ich in 2010 die MSBuild Serie begonnen hatte, war mein Ziel eigentlich, MSBuild als Wegbereiter für eine Artikelserie zum TeamBuild2010 zu nutzen. Aufgrund der Tatsache dass es sehr anstrengend war innerhalb von nur wenigen Wochen die MSBuild Serie zu schreiben (neben dem ganz normalen Projektwahnsinn) fehlte mir schlichtweg die Power um mit TeamBuild2010 noch eine 2. Serie in dieser Größenordnung niederzuschreiben.

Die ein oder anderen Tweets haben mir jedoch einen Ansporn gegeben, die TeamBuild Serie jetzt doch zu schreiben. Wie die Serie schlussendlich aussehen soll ist noch nicht ganz klar.

Bevor ich jedoch mit der TeamBuild2010 Serie starte sind noch 2 Fragen offen, die ich gerne einfach mal an die Community stellen möchte

  1. Besteht überhaupt Interesse an einer TeamBuild2010 Serie?
  2. Welchen Namen sollte die Serie tragen nachdem die erste Serie mit “Das MSBuild Universum” sehr erfolgreich betitelt wurde?

Bin sehr auf euer Feedback gespannt.

 

Technorati Tags: ,,
DotNetKicks-DE Image

Umfrage: Visual Studio/ALM-Konferenz 2011 – Ihre Meinung ist gefragt!

30.03.2011 16:25:20 | Christian Binder

clip_image002

Microsoft beabsichtigt, in den nächsten 12 Monaten wieder eine Konferenz für Entwickler, Tester und IT-Entscheider und -Projektleiter mit Schwerpunkt Application Lifecycle Management mit Visual Studio und Team Foundation Server zu veranstalten. Diese Konferenz ist als Nachfolgerin der erfolgreichen TeamConf-Konferenzen gedacht – mit der Namensvereinfachung von Visual Studio Team System 2008 zu Visual Studio 2010 wird die Konferenz auch einen neuen Namen bekommen.

Bitte helfen Sie uns, auch die neue Konferenz zu einem Erfolg für Sie zu machen :  Lassen Sie uns  Ihr Feedback, Ihre Wünsche und Ihre Anregungen zu den Schwerpunkten Application Lifecycle Management, Teamzusammenarbeit und Testing/QS wissen.

Unter allen Teilnehmern der Umfrage wird ein Konferenzticket verlost, die Umfrage kann natürlich auch anonym ausgefüllt werden.

Direkt zur Umfrage: Was wünschen Sie sich auf der Microsoft Visual Studio ALM-Konferenz 2011?

xtopia[kompakt] Roadshow 2011 – Die finale Agenda

30.03.2011 15:55:28 | Oliver Scheer

Liebe xtopia-Freunde, nur noch 5 Wochen bis zum ersten Halt der xtopia[kompakt] Roadshow 2011. Das ganze xtopia-Team freut sich schon ungemein auf die sechs Stationen in Deutschland. Die Agenda steht nun komplett und es erwartet Sie eine Fülle an brandneuen Themen direkt von der MIX in Las Vegas sowie viele hilfreiche Tipps und Tricks rund um das Design und die Entwicklung von Client-, Web-, und Phone Anwendungen. Jetzt heißt es wirklich schnell sein und einen der begehrten Plätze sichern. Jetzt anmelden auf www.xtopia.de Der Blick auf die Agenda: Die Sessions: Styleguide vs. Brand vs. User Experience? Neue Geräte bringen oft neue User Interfaces mit sich… auch gelten auf unterschiedlichen Gerättypen unterschiedliche Styleguides, also Designregeln. Diese Guides sind sehr informativ wenn man wissen muss, was im UI erlaubt ist und wo die Freiheitsgrade im Design liegen. Ein Styleguide soll auf der anderen Seite aber auch das einheitliche Erlebnis über das ganze Gerät hinweg sicherstellen. Nun reibt sich dieser Anspruch nicht selten mit Aspekten der Markenpräsentation, der „Brand“ und dem entsprechenden corporate design. Wie kann man solche auseinanderstrebende Anforderungen aufarbeiten und lösen? Und damit noch nicht genug. Der treibende Anspruch für Applikationen auf den unterschiedlichen Geräten ist, eine exzellente User Experience zu ermöglichen, also eine Strategie zu formulieren, die sowohl die Anleitungen des Styleguides, die Anforderungen des Markenauftritts wie auch die Regeln der Usability erfüllen kann. Jetzt kann man sich in die Tasche lügen und behaupten, das „Branded Design“ ist an sich ja so toll, dass es sozusagen alles andere mitbringt. Oder man hängt der irren Idee an, dass ein sklavisches Befolgen des Styleguides automatisch eine gute User Experience erzeugen wird. Warum ist die Antwort auf die Frage „Ich habe aber nun eine App gebaut, warum kann ich das Design nicht einfach auf dem Computer verwenden?“ immer wieder sein muss: „Weil der Computer eben kein Handy ist!“. Wir schauen uns diese Aspekte des modernen User Experience Design an und begeben uns auf die Suche nach den Lösungsansätzen für Styleguide + Brand + UX. Wir interpretieren diese Aufgabe im Licht der neuen UI Strategien von Microsoft: Windows Phone 7 Metro Design, Microsoft NUI / Surface Computing und auch Kinect. Webentwicklung mit der Microsoft Web Platform Was ist eigentlich Webentwicklung? Im Grunde lässt sich diese Frage gar nicht so einfach beantworten. Statische Webseiten, ein eigener Blog, ein professionelles CMS, ein Shop-System, eine unternehmensweite Intranet-Applikation, ein Web-Forum, ein Wiki, Social Networks, Chats und vieles mehr. Ein Webentwickler muss heute in vielen Projekten die unterschiedlichsten Technologien beherrschen, immer mit dem Fokus auf die individuellen Voraussetzungen und Wünsche. Die Microsoft Web Platform ermöglicht einem Webentwickler hier aus dem Vollen zu schöpfen. In dieser Session zeigen Dariusz Parys und Tom Wendel in einer Demo-Extravaganza die unterschiedlichsten Microsoft Web-Technologien und wie mit ihnen in kürzester Zeit eine professionelle Webseite entsteht. WebMatrix, Razor, ASP.NET, PHP, Open Source Frameworks, Internet Explorer 9, Silverlight und vieles vieles mehr! „Windows Phone 7 – The Next Generation” Abstract: „Windows Phone 7 war das heiße Thema der xtopia[kompakt] 2010 und ist in der Entwickler- und Designercommunity begeistert aufgenommen worden. Und wir setzen alles daran, diese Erfolgsgeschichte in diesem Jahr fortzusetzen – mit einem umfassenden Paket wichtiger und fundamentaler neuer APIs und Tools, die coole Apps noch leichter realisierbar und neue Szenarien möglich machen. Informieren Sie sich also vor Ort aus erster Hand über das große Update, das 2011 neue Features wie IE9 und Multitasking auf Windows Phone bringen wird!“ Der Sprung nach vorn mit Windows 7 Sie möchten, dass Ihre Anwendung Eindruck hinterlässt? Und Sie möchten auch erreichen, dass Ihre Software nicht aufgrund von Oberflächlichkeiten aussortiert wird, bevor Ihre Kunden überzeugt sind, dass Sie ohne Ihre Lösung nicht mehr leben können? Dann sollten Sie auf diese "Oberflächlichkeiten" achten und die vielen Integrationsfeatures von Windows 7 kennen und nutzen, um Ihre Anwendung zeitgemäß aussehen zu lassen. Seien es so augenfällige Punkte wie die Taskbar, Sprunglisten und die Verwendung von Bibliotheken oder eher verborgene APIs, um den Netzwerk- und Powerstatus des Systems intelligent in Ihre Lösung zu integrieren und dabei gleichzeitig die vorhandenen Ressourcen wie CPU und Akku zu schonen. Anhand einer fiktiven Anwendung zur Verwaltung von Bildern gehen wir in diesem Vortrag gemeinsam den Prozess, eine Anwendung ohne viel Aufwand mittels der neusten Windows 7-Features zu modernisieren. Aller Anfang ist leicht - Microsofts Unterstützung für alle Fälle Damit sich niemand alleingelassen fühlt unterstützt Microsoft mit den Spark Programmen und dem MPR verschiedene Gruppen bei der Realisierung ihrer Projekte. In dieser Session wird erläutert, für wen welche Programmatik gedacht ist und wie man am besten loslegt. Die Sprecher: Clemens Lutsch User Experience Evangelist  Microsoft Deutschland GmbH Dariusz Parys Technical Strategist Web Platform Microsoft Deutschland GmbH Frank Prengel Technical Evangelist Microsoft Deutschland GmbH Peter Kirchner Program Manager für Softwarehersteller Microsoft Deutschland GmbH Tom Wendel Developer Evangelist Microsoft Deutschland GmbH Sebastian Grassl Web Development Product Marketing Manager Microsoft Deutschland GmbH...(read more)

Namespaces in JavaScript Part II

30.03.2011 15:05:32 | Thorsten Hans

Entsprechend der Kommentare, hier noch kurz eine Variante der Namespace Registrierung ohne die Verwendung von eval

// ensure Namespace and Manager objects
if (typeof Namespace == 'undefined') var Namespace = {};
if (!Namespace.Manager) Namespace.Manager = {};
// create a JSON object
Namespace.Manager = {
    // define register method
  Register : function(name)
  {
    var ns = name.split('.'), o = window, i, len;
    for(i = 0, len = ns.length; i < len; i++)
    {
        o = o[ns[ i ]] = o[ns[ i ]] || {};
    }
    return o;
    }};
 
 

Diese Variante verwende ich aktuell auch in meinen Projekten, die Eval Variante war wirklich etwas unschön! xD

DotNetKicks-DE Image

Einfach mal abschalten

30.03.2011 12:03:00 | Jan Christian Selke

Es gibt etwas sehr wichtiges, dass vor einiger Zeit von mir viel zu sträflich vernachlässigt wurde: disconnecting.

Rob Conery und Scott Hanselman berichten über Ihre “ungewöhnliche” Erfahrung in This Developers Life. Jeder, der es noch nicht kennt und/oder von sich der Meinung ist, er arbeite (zu) viel, sollte es sich mal anhören. Ich für meinen Teil konnte mich in einigem davon wiederfinden…

Meiner Meinung nach wertvolle, auf jeden Fall aber auch unterhaltsame 54 Minuten.

SharePoint Dev Quick Tip: Modale Dialoge in ListTemplates deaktivieren

30.03.2011 08:10:20 | Thorsten Hans

Bei der Erstellung von ListTemplates kann man recht einfach die modalen Dialoge für New, Edit und Display.aspx abschalten.

Zwar sieht das XML Schema diese Property nicht vor, aber durch die Angabe von NavigateForFormsPages=”TRUE” werden die modalen Dialog im Kontext der ListenDefinition deaktiviert.

<List xmlns:ows="Microsoft SharePoint" 
   Title="AntragsListe" 
   FolderCreation="FALSE" 
   Direction="$Resources:Direction;" 
   Url="Lists/AntragsListe" 
   NavigateForFormsPages="TRUE"  
   BaseType="0" 
   xmlns="http://schemas.microsoft.com/sharepoint/">
      <!-- content -->
</List>

 

Technorati Tags:

DotNetKicks-DE Image

CreateCert.cmd aus dem Windows Azure Platform Training Kit funktioniert nicht

29.03.2011 23:59:00 | Alexander Zeitler

Im Windows Azure Platform Training Kit wird im Kapitel “Federated Authentication in a Windows Azure Web Role Application” das Batch-File CreateCert.cmd verwendet.

Ruft man dieses wie im Training Kit beschrieben auf, kann folgende Fehlermeldung erscheinen:

CreateCert.cmd mywebsitefederatedidentity
Succeeded
'/nologo' is not recognized as an internal or external command,
operable program or batch file.
'/nologo' is not recognized as an internal or external command,
operable program or batch file.
'/nologo' is not recognized as an internal or external command,
operable program or batch file.
'/nologo' is not recognized as an internal or external command,
operable program or batch file.
Microsoft Windows [Version 6.1.7601]
Microsoft (R) WinHTTP Certificate Configuration Tool
Copyright (C) Microsoft Corporation 2001.

Error: Unable to find or obtain a context for requested certificate

Der Fehler wird verursacht durch das Fehlen des CAPICOM 2.1.0.2 SDK, welches hier heruntergeladen werden kann.

Nach der Installation klappt das Erzeugen und Installieren des Zertifikats.

Das Problem taucht übrigens auf, wenn man nicht die in der Setup.docx (befindet sich im Assets-Ordner des Trainings Kits) beschriebenen Schritte zur Einrichtung der Labs ausführt. Im Zuge der Ausführung des Dependency Checker Tools wird CAPICOM automatisch installiert.

DotNetKicks-DE Image

Namespaces in Javascript

28.03.2011 23:40:01 | Thorsten Hans

Da die Menge an JavaScript in Webprojekten immer und immer mehr zunimmt, gilt es auch auf Clientseite für Ordnung zu sorgen, neben der Dateibasierten Organisation von JavaScript Files, kann man in JavaScript auch auf Namespaces zurückgreifen und somit die JavaScript API etwas ordnen.

Grundlegend sind Namespaces in JavaScript nichts anderes, als eine Verkettung von Objekten. In der einfachsten Form kann man in JavaScript demnach Namespaces wiefolgt definieren

// create root namespace
var DotNetRocks = new Object();
// create subnamespaces
DotNetRocks.Client = new Object();
DotNetRocks.Client.Models = new Object();
// create a class within the namespace
DotNetRocks.Client.Models.User = function(firstName, lastName){
   this.FirstName = firstName;
   this.LastName = lastName;
 
   this.greet = function(){
     alert("Hello " + this.FirstName + " " + this.LastName);
   };
 
};
 
// create a new instance
var currentUser = new DotNetRocks.Client.Models.User("Thorsten", "Hans");
// calling the instance method
currentUser.greet();

Wie man sieht ist es sehr einfach Namespaces in Javascript zu erstellen und die einzelnen Klassen darin anzusiedeln. Allerdings bringt dieser Lösungsweg einige Probleme mit, welche man im täglichen Leben natürlich nicht haben möchte.

Das Snippet müsste erweitert werden, so dass Root- und SubNamespaces nur erstellt werden wenn diese noch nicht existieren, weil sonst die jeweiligen Objektdefinitionen überschrieben würden.

Anstatt dessen, sollte man sich eine einfache Hilfsklasse erstellen, die das Registrieren von Namespaces übernimmt. Auch Microsoft AJAX bringt eine solche Funktionalität mit sich. Um ein Verständnis für den Aufbau der Komponente zu erlangen, empfiehlt es sich allerdings einfach mal die paar Zeilen JavaScript zu lesen bzw. zu schreiben.

// ensure Namespace and Manager objects
if (typeof Namespace == 'undefined') var Namespace = {};
if (!Namespace.Manager) Namespace.Manager = {};
// create a JSON object
Namespace.Manager = {
    // define register method
    Register: function (namespace) {
        // split the input on each dot to provide subnamespaces
        namespace = namespace.split('.');
        // ensure root namespace
        if (!window[namespace[0]]) window[namespace[0]] = {};
        // create all the subnamespaces, if not present
        var strFullNamespace = namespace[0];
        for (var i = 1; i < namespace.length; i++) {
            strFullNamespace += "." + namespaceIdea;
            eval("if(!window." + strFullNamespace + ")window." + strFullNamespace + "={};");
        }
    }
};

Diese kleine Snippet muss logischer Weise innerhalb der Page bekannt gemacht werden.

Hierbei gibt es sowohl in ASP.NET, als auch in SharePoint diverse Wege wie man dies erreichen kann. Entweder man geht den klassischen Weg über eine MasterPage mit entsprechendem <script/> Tag, oder man schreibt ein kleines HttpModule welches das Script immer in die Response rendert. In SharePoint kann man allerdings noch die etwas elegantere Lösung wählen und ein DelegateControl erstellen und dieses, mit einer sehr niedrigen Sequence Number in den AdditionalPageHead einbinden.

Die Verwendung der Register Methode ist denkbar einfach:

Namespace.Manager.Register("DotNetRocks.Client.Models");

Auf die eigentliche Typdefinition wirkt sich die alternative Namespace-Definition allerdings nicht aus, mit der Namespace.Manager.Register Variante sieht die Typdefinition und –Verwendung wiefolgt aus

Namespace.Manager.Register("DotNetRocks.Client.Models");
 
DotNetRocks.Client.Models.User = function (firstName, lastName) {
    this.FirstName = firstName;
    this.LastName = lastName;
 
    this.greet = function () {
        alert("Hi " + this.FirstName + " " + this.LastName);
    };
 
};
 
var myUser = new DotNetRocks.Client.Models.User('Thorsten', 'Hans');
myUser.greet();

 

Was bringen Namespace in JavaScript?

Javascript habe ich selbst lange Zeit als notwendiges Übel identifiziert, doch spätestens mit dem jQuery – Hype fing JavaScript an Spaß zu machen. Ich selbst setzte an immer mehr stellen auf Plain Javascript anstatt irgendwelche ASP.NET Controls von Drittanbietern zu verwenden. Aber Namespaces in JavaScript!? Braucht man das wirklich?

- Ja! Es hilft definitiv dabei den clientseitigen Code lesbarer und wartbarer zu machen. Klar bedarf es minimal mehr Zeit bei der Entwicklung, aber der unterschied ist so minimal – und beim Ersten Fehlersuchen eh schon wieder eingespart.

Wohin führt dies?

Doch wohin führen uns solche Konzepte in JavaScript, durch den Einsatz von Namespaces in JavaScript ist man schnell an dem Punkt wo man sagt “Dann machen wir pro Namespace einen Ordner um in der Solution schneller navigieren zu können. Na, wenn wir schon dabei sind, dann packen wir doch gerade mal jede JS-Klasse in eine eigene Datei, denn wenn schon Ordnung dann richtig.

Das klingt ja grundsätzlich nicht falsch, allerdings impliziert dies meiner Meinung nach auch den Einsatz von Libs wie HeadJS, damit man nicht hunderte von JS Files beim PageLoad laden muss.. und schon bläht sich die Sache immer und immer weiter auf. Daher gilt es abzuwägen ob und in welcher Form eine physikalische Strukturierung von JavaScript Sinn macht und Notwendig ist.

Was meint ihr?

 

DotNetKicks-DE Image

SQL-Montag: Was ist der Unterschied zwischen “Delete From” und “Truncate”?

28.03.2011 22:42:28 | Jan Welker

Thomas Mentzel hat in seinem Blog eine ziemlich coole Aktion gestartet, bei der er am Anfang der Woche fünf Fragen stellt.
Jede Frage bezieht sich auf einen anderen Werktag der Woche und behandelt ein Thema aus dem .NET-Programmierumfeld.

Die erste Frage, die er zum heutigen “SQL-Montag” gestellt hat, ist: Was ist der Unterschied zwischen Delete From und Truncate?

Diese Frage möchte ich gern beantworten.

delete-truncateDelete und Truncate sind T-SQL Befehle, mit denen Datensätze aus Tabellen einer MS-SQL Datenbank gelöscht werden können.
Das sind auch schon die Gemeinsamkeiten. Die Unterschiede liegen im Detail.

Der Befehl Delete löscht die Datensätze physikalisch und speichert das Löschen jeder einzelnen Zeile im Transaction-Log ab. Werden viele Zeilen gelöscht, wächst das Log File entsprechend schnell.


Werden Datensätze mit Truncate gelöscht, werden die Datensätze nicht physikalisch gelöscht, sondern werden nur zum überschreiben freigegeben. Das Freigeben der Daten wird ebenfalls geloggt, nur auf eine andere Art und Weise.
Dadurch ist Truncate zwar schneller, hat aber auch einige Nachteile:

  • Um ein Truncate Statement ausführen zu dürfen, muss man db_owner, ddl_admin oder Besitzer der Tabelle sein.
  • Truncate funktioniert nicht bei Tabellen, die FOREIGN KEY Constraints haben.
  • Truncate kann keinen Trigger aktivieren.
  • Die Daten einer Tabelle können nicht mit Truncate gelöscht werden, wenn die Tabelle Grundlage einer View ist.

Ein weiterer wesentlicher Unterschied ist, dass man bei Delete die zu löschenden Daten mit Hilfe der Where Bedingung einschränken kann. Mit Truncate können nur ganze Tabellen gelöscht werden.

Löscht man Daten aus einer Tabelle, die eine IDENTITY-Spalte hat, kann man beim Truncate Statement feststellen, dass der Wert der IDENTITY-Spalte auf den Ausgangswert (in der Regel 0) zurück gesetzt wird.
Löscht man die Daten hingegen mit dem Delete Statement, sieht man, dass der Zähler der IDENTITY-Spalte erhalten bleibt.

Hierzu noch ein Tipp: Möchte man mit Delete löschen, weil man beispielsweise eine Where Bedingung braucht, kann man den Zähler der IDENTITY-Spalte nachträglich auf den Ausgangswert mit Hilfe des folgenden Befehls auf 0 zurück setzen:

DBCC CHECKIDENT
(Tabellenname, reseed, 0)

Wer beantwortet morgen die Frage zum Thema LINQ? Smiley

dotnet Cologne 2011: Anmelden auf die Warteliste lohnt sich!

27.03.2011 23:39:57 | Roland Weigelt

Die dotnet Cologne 2011, die große von den .NET User Groups Bonn und Köln organisierte Community-Konferenz rund um .NET, ist nach nicht einmal zwei Wochen theoretisch ausgebucht.

Allerdings nur “theoretisch”, denn die Erfahrungen der vergangenen Jahre haben gezeigt, dass eine nicht geringe Zahl von Plätzen recht schnell wieder frei werden. Entweder weil die Teilnahme abgesagt oder aber (beinahe häufiger) nach Ablauf der Überweisungsfrist und einer anschließenden Mahnung schlicht und ergreifend nicht bezahlt wird.

Diese freiwerdenden Plätze werden dann von der Warteliste in der Reihenfolge der Anmeldung gefüllt. Und das waren letztes Jahr eine ganze Menge!

Deshalb gilt: Wer sich jetzt anmeldet hat noch sehr gute Chancen, nachzurücken – so z.B. bereits in einer ersten Runde Anfang April.

Hier geht’s zur Anmeldung

.NET Open Space Süd 2011 in Karlsruhe am 16. und 17. Juli 2011

25.03.2011 10:51:00 | Alexander Zeitler

.NET Open Space Süd 2011 in Karlsruhe

Zusammen mit Aydin, Frank, Ralf, Thomas und Kostja organisiere ich den .NET Opensapce Süd 2011 in Karlsruhe. Seit heute 11 Uhr ist die Registrierung geöffnet.

Die besten Gespräche hat man fernab von einer festgelegten Agenda, bei einem Kaffee und beim "du". Dort gibt es keine Rollenaufteilung in Sprecher / Zuhörer, Entwickler / Administrator usw. und die Themen finden sich vor Ort ganz von selbst. Das ist die Idee vom .NET Open Space, die sich bereits seit 2008 in Leipzig, Ulm und Karlsruhe bewährt hat. Hier sind alle gleich. Auch die Organisatoren halten sich im Hintergrund und moderieren nur ab und an etwas.

Der .NET Open Space Süd 2011 läuft vom 16.07.2011 bis 17.07.2011. Welche Inhalte in dieser Zeit bearbeitet werden, wird vor Ort bestimmt, denn die Veranstaltung ist Open Space.

Die Teilnahme ist kostenlos. Wenn du möchtest, kannst du den Organisatoren einen Geldbetrag zukommen lassen, welcher für die Gestaltung (Abendveranstaltung, Getränke etc.) verwendet wird. Trage den Betrag hier mit in die Teilnehmerliste ein. Über die Höhe des Betrages, ob z.B. 25 EUR, 50 EUR, 100 EUR oder mehr, entscheidest du vollkommen frei und selbst. Bedenke, dass die Veranstaltung gerade vom Sponsoring der Teilnehmer lebt.

Die Teilnehmer gestalten das Programm selbst. Erfahrungsaustausch ist das A und O und steht im Vordergrund.

Mehr Informationen und Anmeldung unter: http://karlsruhe.netopenspace.de

Twitter-Nutzer erhalten aktuelle News von @nossued.

Der offizielle Twitter-Hash-Tag ist #nossued.

Ich würde mich natürlich freuen, möglichst viele bekannte Gesichter und den einen oder anderen Leser meines Blogs bei diesem Event begrüßen zu dürfen.

Ausdrücklich möchte ich betonen, dass dies nicht nur ein Event für Experten ist, sondern dass natürlich auch Teilnehmer willkommen sind, die sich noch nicht für solche halten.

An dieser Stelle auch ein herzliches Dankeschön an Alexander Groß für die Unterstützung bei der Einrichtung der Website für den .NET Open Space Süd 2011.

Wenn Ihr für den .NET Open Space Süd 2011 in Karlsruhe werben wollt, könnt Ihr dieses Logo verwenden:

.NET Open Space Süd 2011 in Karlsruhe

DotNetKicks-DE Image

Windows Azure Toolkit für Windows Phone 7

25.03.2011 07:17:51 | Oliver Scheer

Aus dem Blog von Holger Sirtl . Ab sofort ist die Release Version des Windows Azure Toolkit for Windows Phone 7 verfügbar. Es kann unter folgendem Link heruntergeladen werden: http://watoolkitwp7.codeplex.com/ Mit Hilfe dieses Toolkits können Windows Phone 7 Anwendungen entwickelt werden, die Services verwenden, die auf Windows Azure ausgeführt werden. Umfang des Toolkits Binaries für Windows Phone 7 Anwendungen Projektvorlagen für Visual Studio Beispielanwendungen in C# und VB.NET Dependency Checker das die Voraussetzungen des Toolkits prüft Dokumentation zu Setup und Konfiguration Voraussetzungen für das Toolkit Microsoft Visual Studio 2010 Professional (oder höher) oder sowohl Microsoft Visual Web Developer 2010 Express und Microsoft Visual Studio 2010 Express for Windows Phone Windows Phone Developer Tools (January 2011 Update) Silverlight for Windows Phone Toolkit – Feb 2011 Internet Information Services 7 (IIS7) Windows Azure SDK 1.4 (March 2011) Windows Azure Tools for Microsoft Visual Studio 2010 (March 2011) Sobald das Toolkit dann installiert ist, stehen unter Visual Studio neue Projektvorlagen zur Verfügung: Abb 1: Neue Projektvorlagen unter Visual Studio 2010 Weitere Informationen Original Blog Post der Azure Produktgruppe Windows Azure Toolkit for Windows Phone 7 Wade Wegner's Blog Post, " Windows Azure Toolkit for Windows Phone 7 " Getting Started with the Toolkit...(read more)

WP7: WPConnect Tool for debug wo zune

24.03.2011 18:10:00 | Patric Schouler

Using the device debugger with a zune connection is a great advantage of Windows Phone 7 development. But if you want to test some choosers ( for example the PhotoChooserTask) you can not do this with a running zune connection.

Fortunately there's a tool that solves the problem by removing the need to have the Zune software running while debugging. It's called the Windows Phone Connect Tool. It was released as part of the recent update to the Windows Phone Developer Tools. This tool allows you to close the Zune software, after your phone device is connected. After this it is possible to debug choosers such as the PhotoChooserTask.

Here you can get a batch file to do the work for you:

Daniel Vaughan | A Batch File for Closing Zune and Launching the WPConnect Tool

Advanced Developers Conference – C++

23.03.2011 14:16:35 | Christian Binder

Am 5. und 6. Mai 2011 findet in Prien am Chiemsee die Advanced Developers Conference speziell zum Thema "Native C++" statt. Mit von der Partie ist unter anderem  Boris Jabes, Senior Program Manager für Visual C++ bei Microsoft. Für alle C++ Entwicker eine gute Chance sich zum Thema zu informieren und zu diskutieren. Mehr direkt unter http://www.cpp.adc11.de

Schon gesehen?

C++ Renaissance: a Channel 9 Interview
Ein Interview mit Microsoft Technical Fellow Mohsen Agsen and Director PM Craig Symonds über die C++ Trends.

und natürlich der Visual C++ Team Blog

Team Build – Erster Eindruck

23.03.2011 03:34:03 | Jürgen Gutsch

Mein erster Eindruck vom Team Build des TFS 2010 ist leider sehr negativ.

Die Gründe sind zum einen die Umsetzung mit der Workflow Foundation 4.0 und die dadurch entstandene Komplexität, bzw. die verringerte Flexibilität. Selbstverständlich kann man Team Build auch weiterhin mit MSBuild nutzen, ist aber aus meiner Sicht genauso eingeschränkt wie in der Version 2008. Die Workflow Foundation hat Team Build nicht einfacher gemacht, sondern noch komplexer.

Natürlich lässt sich der Workflow mit eigenen Activities ergänzen und erweitern, allerdings müssen die erst Programmiert und getestet werden. Einen vorhandenen Build auf den neuen Team Build 2010 zu migrieren, ist aufgrund des zu hohen Aufwands eher unsinnig. Der Aufwand erhöht sich, wenn Microsoft-fremde Komponenten wie z. B: NUnit genutzt und ausgewertet werden sollen.

Fängt man mit einem komplett neuen Build-Prozess, einem neuen Projekt an und hat man bereits ausreichend Erfahrungen mit der Workflow Foundation 4.0 macht Team Build eventuell mehr Sinn und kann in diesem Fall auch relativ flexibel werden. Komplex bleibt es dennoch.

Die eigene Migration

Die Migration die ich jetzt vorgenommen habe, sieht lediglich so aus, dass ich die Sourcen statt von der alten Versionsverwaltung, nun vom TFS hole:

1. Continous Integration

Hudson der für die Continous Integration und die Nightly Builds zuständig ist, wurde lediglich um das TFS-Add-In erweitert. Die Sourcen werden nun vom TFS geholt, statt vom SVN. Das ist alles. Gebaut und getestet wird dann wie zuvor auch.

2. Release Build

Die Migration, des rein auf MSBuild basierende Release Builds war etwas kniffliger, da es keine vernünftigen MSBuild-Tasks gibt. Hier war der Weg über die tf.exe nötig sowie die Auswertung der Konsolenausgabe.

Folgende Anforderungen muss das Release Build erfüllen:

  • Unterscheidung zwischen Test-Build (für die Software-Tester) und Release Build.
  • Ermitteln der aktuellen Revisionsnummer, wenn keine übergeben wir.
    => Zugriff auf die Versionsverwaltung
  • Holen der aktuellen Sourcen
    => Zugriff auf die Versionsverwaltung
  • Updated die Versions-, Build-, und Revisionsnummer in den AssemblyInfos
  • Bauen der Anwendungen (4x Server; 8x Client)
  • Kopieren der Artefakte in die Zielverzeichnisse
  • Ermitteln der Revisionsinformationen seit dem letzten Build
    => Zugriff auf die Versionsverwaltung
  • Kopieren der Revisionsinformationen in die Zielverzeichnisse
  • Label im TFS setzen
    => Zugriff auf die Versionsverwaltung
  • Versandt der Erfolgs-E-Mail an alle beteiligten

Alle Zugriffe auf die Versionsverwaltung gehen nun über die tf.exe. Die Auswertung der Konsolenausgabe erfolgt per MSBuild-Taks (entweder mit den vorhandenen Tasks von Microsoft, den MSBuild Community Tasks oder dem MSBuild Extension Pack)

Den vorhandenen Build einfach umzubiegen war somit trotz einiger kleinen Hürden wesentlich einfacher als auf Team Build 2010 zu migrieren

Fazit

Team Build nutzen: Ja, wenn man Workflow Foundation 4.0 kennt und ein neues Projekt anfängt und Microsoft Technologie zum Testen der Software nutzt.

Team Build nutzen: Nein, wenn man migriert, Workflow Foundation 4.0 nicht kennt, Test-Frameworks nutzt die nicht von Microsoft stammen und/oder den Build einfacher anders machen kann.

Sehr gerne hätte ich Team Build genutzt, um auch hier den vollen Umfang vom TFS zu nutzen. Sehr gerne hätte ich die Testberichte aus den NUnit-Tests im TFS integriert gesehen. Aber der enorme Aufwand wäre einfach nicht vertretbar gewesen.

DotNetKicks-DE Image

Tools für den TFS

23.03.2011 02:42:05 | Jürgen Gutsch

Hier mal eine kurze und unvollständige Übersicht über Tools die für den TFS ganz nützlich sind:

Team Foundation Sidekicks

Aus meiner Sicht ist Sidekicks das wichtigste Tool für die Administration des TFS. Sidekicks ist sozusagen die schnelle Einsatzzentrale um eventuelle Probleme der Versionskontrolle zu beheben. Zum Beispiel, wenn ein Entwickler im Urlaub ist und vergessen hat Locks zu entfernen, kann das über Sidekicks erfolgen. Man kann es aber auch einfach nur nutzen um die Übersicht über die Versionskontrolle zu nutzen.

http://www.attrice.info/cm/tfs/

Team Foundation Server Power Tools

Um den TFs einzurichten, sind die Power Tools das wichtigste Werkzeug. Unter anderem können mit dem Power Tools die Prozess-, und Work Item-Templates angepasst werden und es gibt einige weitere Zugriffsmöglichkeiten (z. B. auf die Teammember, umfangreichere Suche in der Versionskontrolle, Quicklabel, etc.) auf den TFS die sonst nicht möglich sind.

http://visualstudiogallery.msdn.microsoft.com/c255a1e4-04ba-4f68-8f4e-cd473d6b971f

tf.exe

tf.exe ist der Konsolen-Client zum TFS. So lässt sich alles was über den Team Client im Visual Studio machbar ist, auch über die Kommandozeile machen. Interessant wird die tf.exe allerdings erst, wenn man seine Builds mit einem anderen Build-Tool als mit Team Build machen möchte. So habe ich mein Vorhandenes MSBuild-Script, das zuvor auf den SVN Server ging einfach auf den TFS umgebogen.

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

Artiso Work Item Manager

Der Work Item Manager aus den ALM-Tools von der Artiso AG ist ein feines Tool, um schnell und bequem die Work Items zu verwalten. Hierarchische Ansichten von Work Items wurden schon unterstützt als es mit TFS 2008 noch gar keine Hierarchien gab. Als ich das Werkzeug das erste mal benutzte, habe ich ehrlich gesagt etwas mehr Features erwartet, aber dass Tool macht was es soll: Es erleichtert das managen der Work Items. Lediglich die Performance leidet bei langsamer Verbindung sehr. Dieser Work Item Manager ist als einziges Tool in dieser Auflistung nicht kostenfrei. Allerdings ist der Testzeitraum bei vollem Feature-Umfang groß genug um zu entscheiden ob er einem nützlich erscheint oder nicht.

http://www.almtools.de/Default.aspx?Page=50

AIT Task Board

Das Task Board stellt eine Art Scrum Board dar, über das die Work Items übersichtlich angeordnet werden. Bisher konnte ich es noch nicht wirklich selber testen, da AIT den versandt der Zugangsdaten (zum Downloaden muss man sich registrieren) scheinbar nicht automatisiert haben. Allerdings scheint der erste Eindruck über die Website schon recht vielversprechend.

(Sobald ich die Software getestet habe schreibe ergänze ich den obigen Absatz)

http://www.aitgmbh.de/ait_scrum_taskboard.0.html

Telerik Work Item Manager

Dieser Work item Manager umfasst scheinbar die Features des Artiso Work Item Manager und des AIT Task Board. Zusätzlich enthält es einen TFS Project Dashboard, dass allerdings völlig unsinnig ist, wenn man (wie ich) nicht den vollen Umfang des TFS nutzt, da über die hälfte der Dashboard-Items (für Builds, Tests, etc) unsinnige oder keine Daten enthalten. Das Tool sieht klasse aus und kann als gute Demo für die RadControls für WPF herhalten ;-)

http://www.telerik.com/.../tfs-work-item-manager-features.aspx

TFS Auto Shelve

Shelve-Sets der unvollständigen Arbeiten sind Pflicht. Wer seine unvollständige Arbeit regelmäßig im TFS sichern möchte ist mit dem Auto Shelve gut dran. Das Tool shelved alle Änderungen in einem angegebenen Intervall in den TFS ein. Ähnlich der VBScript-Datei die ich vor Jahren mal verwendet habe, um immer kurz vor Feierabend alle Änderungen als Shelve-Set zu sichern. Wer das nicht von Hand machen möchte sollte dieses Tool nutzen.

http://geekswithblogs.net/.../tfs-auto-shelve---new-visual-studio-2010--tfs.aspx

Search Work Items

Ein kleines aber feines Tool, dass standardmäßig Title, History und Description durchsucht. Die zu durchsuchenden Felder können allerdings auch konfiguriert und ergänzt werden.

http://geekswithblogs.net/.../search-work-items-for-tfs-2010---new-extension.aspx

SVN to TFS Migration Tool

Wer seine Codes von SVN zu TFS migrieren möchte kann sich demnächst das SVN to TFS Migration Tool auf Bitbucket herunterladen. Das Tool wird von mir entwickelt und im Auftrag der ASS.TEC GmbH als Open Source zur Verfügung gestellt. Aktuell sind noch ein paar Änderungen notwendig, bevor ich es publizieren kann. Das Repository ist allerdings schon eingerichtet:

https://bitbucket.org/asstec/svn2tfs-migration-tool

DotNetKicks-DE Image

DevConnections im Juni in Karlsruhe – Fachkonferenz für Entwickler und IT Professionals

22.03.2011 13:05:31 | Oliver Scheer

Weltweit bekannte Technologie-Experten wie Juval Lowy, John Papa oder Kimberly L. Tripp geben anlässlich der DevConnections , die Teil einer internationalen Veranstaltungsreihe ist, am 9. und 10. Juni 2011 in Karlsruhe ihr Wissen rund um die Technologieplattform von Microsoft weiter. Unter dem Motto "The Conversation Begins Here“ können Teilnehmern der Fachkonferenz zukünftige Technologien kennenlernen, detailliert in aktuelle Technologien einsteigen sowie Probleme und Fragen diskutieren. Die Agenda der DevConnections setzt sich aus acht verschiedenen thematischen Tracks für Entwickler und IT Professionals zusammen. Mit dabei in Karlsruhe sind Themenblöcke zu ASP.NET, Exchange, SharePoint Administration, SharePoint Development, Silverlight, SQL Server, Visual Studio und Windows. Neben den technischen Vorträgen dürfen sich die Teilnehmer auch über drei Keynotes von Dave Mendlen (Senior Director Developer Platform and Tools), Steve Fox (Director Developer and Platform Evangelism for SharePoint) und Scott Guthrie (Corporate Vice President .NET Developer Platform) freuen. Zusätzlich findet im Vorfeld der Konferenz am 8. Juni ein separater Tag mit acht verschiedenen Ganztages-Workshops zu den einzelnen Themenbereichen statt. Die Teilnahmegebühr für die zweitägige Konferenz liegt bei 1.199 Euro zzgl. MwSt. Bei einer Anmeldung bis zum 31. März 2011 können Interessierte dank des Super Early Bird-Tarifs rund 300 Euro sparen. Wer sich bis zum 13. Mai 2011 anmeldet, kann immerhin noch gute 200 Euro mit dem Early Bird-Tarif sparen. Die Teilnahme am Workshop-Tag kostet 499 Euro zzgl. MwSt. Auch hier besteht die Möglichkeit, bei einer Anmeldung bis zum 13. Mai mit dem Early Bird-Tarif 150 Euro zu sparen. Jetzt registrieren lohnt sich! Weitere Informationen unter: http://www.devconnections.com/germany/...(read more)

Service Pack 1 für Expression Web 4 ab sofort verfügbar: Volle HTML 5 Unterstützung!

22.03.2011 11:20:33 | Oliver Scheer

Ab sofort steht Service Pack 1 für Expression Web 4 kostenlos zum Download zur Verfügung. Neben Bugfixes und Verbesserungen an Stabilität und Performance wird Expression Web auch um eine Reihe interessanter neuer Features erweitert: HTML 5 Mit Service Pack 1 erhält Expression Web 4 Support für HTML 5: Im Code Editor können Sie dank IntelliSense die neuen HTML 5-Tags ohne Probleme in Ihren Code integrieren. In der Designansicht können außerdem Block- und Inline-Elemente direkt ausgerichtet und angepasst werden. CSS3 Dank Service Pack 1 unterstützt Expression Web 4 ab sofort Hunderte neuer Eigenschaften, die Teil der kommenden CSS3-Spezifikation sind. Konkret bietet Expression 4 SP1 Support für CSS3 über IntelliSense , das Fenster „ CSS-Eigenschaften “ sowie die beiden Dialoge „ Neue Formatvorlage “ und „ Formatvorlage ändern “. Erweiterte PHP-Unterstützung Weiterhin bietet Expression Web 4 IntelliSense für die neuesten Funktionen von PHP 5.3 sowie Unterstützung für mehr als 130 zusätzlicher PHP-Module. Die Tooltips der einzelnen Funktionen bieten ab sofort Informationen darüber, ab welcher Version diese von PHP unterstützt werden. Zu guter Letzt ist es dank des „ Open As PHP “-Features möglich, jede Datei (unabhängig von ihrer Endung) als PHP-Datei zu behandeln. IntelliSense für Sonderzeichen Über die so genannten IntelliSense Character Entities ist es nun möglich, schnell und einfach das passende HTML-Kürzel für Sonderzeichen zu finden. Sobald Sie im Code Editor „&“ eingeben, erhalten Sie eine Liste verschiedener HTML-Codes für Sonderzeichen, wie zum Beispiel &ndash; für einen Gedankenstrich. SuperPreview – Seiten mit Benutzerauthentifizierung Nach Installation von Service Pack 1 wird es außerdem auch möglich sein, Webseiten zu testen, die eine Benutzerauthentifizierung benötigen. Ein mögliches Szenario hier wäre zum Beispiel, dass Sie sich die Vorschau zur Administrationsseite eines Blogs anzeigen lassen möchten. Mit SP1 ist es möglich, sich einzuloggen und sich die gewünschte Seite in verschiedenen Browsern zu betrachten. Internet Explorer 9 Die finale Version des Internet Explorer 9 ist mit Service Pack 1 auch als lokaler Browser für SuperPreview und die Web Snapshot-Funktion von Expression verfügbar. Wenn Sie Internet Explorer 9 installiert haben, können Sie sich die Darstellung von Seiten in den Versionen IE6, IE7, IE8 und IE9 anzeigen lassen. Außerdem erkennt Expression Web SP1 weitere installierte Browser (z.B. Chrome, Firefox oder Opera) und zeigt diese unter der Funktion „Vorschau“ an. SuperPreview Online Service Der Expression Web SuperPreview Online Service, die sich noch im Beta-Zustand befindet, erweitert die Möglichkeiten von SuperPreview um zusätzliche Browser und Betriebssysteme – dazu gehören unter anderem Chrome, IE8, IE9, Safari 4 und Safari 5 auf Windows oder Mac. Den Download finden Sie hier....(read more)

JSON via jQuery direkt an einen ASP.NET MVC 3 Controller senden

22.03.2011 10:14:00 | Alexander Zeitler

Will man via jQuery Ajax Call Daten an einen ASP.NET MVC 3 Controller senden, kann man dies z.B. tun, indem man die Post-Daten quasi “von Hand” zusammensetzt und sendet:

<script type="text/javascript">
	function addCustomer() {
		var companyName1 = $("#addcustomer_companyname1").val();
		var addressLine1 = $("#addcustomer_addressline1").val();
		var zipCode = $("#addcustomer_zipcode").val();
		var city = $("#addcustomer_city").val();
		$.ajax({
			type: "POST",
			url: "/Customer/Add",
			data: "companyName1=" + companyName1 + "&addressLine1=" + addressLine1 + "&zipcode=" + zipCode + "&city=" + city,
			dataType: "html",
			success: function (result) {
				$("#status").append(result);
			},
			error: function (error, response) {
				alert(error.responseText);
			}

		});
	}
</script>

Seit ASP.NET MVC 3 gibt es allerdings auch out of the box die JsonValueProviderFactory, die ein Model-Binding an JSON-Parameter von Controller-Action-Methoden erlaubt.

Damit kann mal also auch JSON direkt per jQuery an einen Controller senden:

<script type="text/javascript">
	function addCustomer() {
		var company = getCompany(); // Kundendaten aus Eingabefeldern lesen
		var json = $.toJSON(company); // und per jquery-json in JSON konvertieren
		$.ajax({
			type: "POST",
			url: "/Customer/Add",
			dataType: 'html',
			// Contenttype muss gesetzt werden!
			contentType: 'application/json; charset=utf-8', 
			data: json,
			cache: false,
			success: function (result) {
				$("#status").append(result);
			},
			error: function (error, response) {
				alert(error.responseText);
			}
		});
	}

	function getCompany() {
		var companyName1 = $("#addcustomer_companyname1").val();
		var addressLine1 = $("#addcustomer_addressline1").val();
		var zipCode = $("#addcustomer_zipcode").val();
		var city = $("#addcustomer_city").val();

		return { CompanyName1: companyName1, AddressLine1: addressLine1, ZipCode: zipCode, City: city, Id:null };
	}
</script>

Wichtig sind hierbei folgende Änderungen:

  • Der contentType muss auf JSON gesetzt werden
  • Damit das JSON erstellt werden kann, benötigt man ein entsprechendes Script, z.B. jquery-json, welches ein jQuery-Plugin ist.
DotNetKicks-DE Image

Meine Erfahrungen mit Hetzner Root Servern

21.03.2011 23:08:15 | Jan Welker

Anfang März 2010 liefen das dotnet-forum.de, dotnet-kicks.de sowie der thumbscreator.net auf einem kleinen virtuellen Server bei Hosteurope. Der Server war zuverlässig, aber hatte zu wenig Arbeitsspeicher was den installierten SQL Server stark ausgebremst hatte.
Ich machte mich also auf die Suche nach einem Server mit mehr Speicher, größerer Festplatte und mehr Rechenleistung. Bei der Suche nach einem passenden Server spielte auch der Preis eine große Rolle, da sämtliche Webseiten, die auf dem neuen Webserver laufen sollten, kein bzw. wenig Geld einbringen. Bei diesen Anforderungen war die Auswahl der Anbieter nicht sehr groß.

Hetzner-Erfahrungen

Da ich von Thomas Bandt und Gordon Breuer schon von Hetzner gehört hatte, hab ich mir die Firma und deren Produkte etwas genauer angesehen. Der günstigste Root-Server mit 8 GB RAM und einem Intel Quadcore Prozessor kostete monatlich nur 49€. Zu diesen 49€ kamen noch 20€ für die Windows Server Lizenz und eine einmalige Einrichtungsgebühr von 100€ hinzu. Trotzdem sind die knapp 70€ im Monat im Vergleich zur Konkurrenz sehr günstig gewesen. Bei Mitbewerbern kann man für vergleichbare Server ganz leicht 200€ und mehr pro Monat auf den Tisch legen. Der Preis passte also. Nun blieb die Frage nach der Qualität der Hardware und des Supports. Ich erkundigte mich bei Gordon und Thomas, die beide langjährige Hetzner Kunden waren. Beide haben mit Hetzner keine schlechten Erfahrungen gemacht, also bestellte ich den EQ4 Server. Der erste Eindruck von dem Server war durchweg positiv. Das Raid 0 war nur ein Software Raid aber dies lässt sich unter Windows ganz einfach managen. Die restliche Hardware bestand aus gewöhnlichen Desktop-Komponenten soweit ich das über verschiedene Tools wie zum Beispiel SiSoft Sandra feststellen konnte. Das war mir aber relativ egal. Wenn irgendetwas kaputt gehen sollte, hab ich ja ein Backup und den Hetzner Support. Da ich auch keine hochkritischen Anwendungen auf dem Server laufen lassen wollte, brauchte ich keine extrem hohe Verfügbarkeit. Nach dem der Server knapp zwei Wochen lief, begrüßte mich Windows beim Login mit einem Dialog, der mich fragte, warum der Server unerwartet neu gestartet wurde. Ich hatte keine Ahnung was passiert war und ignorierte die Fehlermeldung vorerst. Einige Wochen später waren meine Webseiten für einige Minuten nicht erreichbar und ich musste erneut feststellen, dass der Server aus irgendeinem Grund neu gestartet wurde. Ein Blick in das Windows Event Log gab folgende Details preis:

- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
  <Provider Name="Microsoft-Windows-Kernel-Power" Guid="{331C3B3A-2005-44C2-AC5E-77220C37D6B4}" />
  <EventID>41</EventID>
  <Version>2</Version>
  <Level>1</Level>
  <Task>63</Task>
  <Opcode>0</Opcode>
  <Keywords>0x8000000000000002</Keywords>
  <TimeCreated SystemTime="2010-04-12T20:32:53.575254600Z" />
  <EventRecordID>2876</EventRecordID>
  <Correlation />
  <Execution ProcessID="4" ThreadID="8" />
  <Channel>System</Channel>
  <Computer>OWNEROR-L24TE01</Computer>
  <Security UserID="S-1-5-18" />
  </System>
- <EventData>
  <Data Name="BugcheckCode">0</Data>
  <Data Name="BugcheckParameter1">0x0</Data>
  <Data Name="BugcheckParameter2">0x0</Data>
  <Data Name="BugcheckParameter3">0x0</Data>
  <Data Name="BugcheckParameter4">0x0</Data>
  <Data Name="SleepInProgress">false</Data>
  <Data Name="PowerButtonTimestamp">0</Data>
  </EventData>
  </Event>

Nach kurzen googlen fand ich einen MS KB Eintrag zu diesem Problem, der im Wesentlichen aussagt, dass Windows neu gestartet wurde, weil irgendwas mit der Hardware nicht stimmte, als mögliche Ursachen nennt Microsoft bei diesem Bugcheck-Code zum Beispiel  Übertaktung oder Stromausfall. Ich meldete mich darauf hin beim Hetzner Support, der auch schnell reagierte und den Arbeitsspeicher austauschte. Leider ohne Erfolg. Beim nächsten Reset wurde das Netzteil getauscht. Was natürlich jedes Mal einen längeren Ausfall der Webseiten nach sich zog. Die Resets wurden leider nicht weniger, inzwischen hinterließen die Resets auch Datenverlust und beschädigten sogar einmal die SQL Server Installation, was wieder einen längeren Ausfall der Webseiten nach sich zog.

Hetzner1

Der Hetzner Support war stets bemüht irgendetwas zu unternehmen um den Fehler zu finden. Im Laufe der Zeit wurde die gesamte Hardware durchgetauscht. Fehler an der Infrastruktur wie zum Beispiel Kühlung, Stromversorgung usw. schloss Hetzner aus.
Auf der Softwareseite habe ich natürlich auch alles Erdenkliche getan, um den Fehler einzukreisen. Von Belastungstests (Prime95), Virus- und Malewarescans bis hin zum Einsatz von verschiedenen Diagnose-Tools hab ich alles versucht.
Als das alles nichts geholfen hat, habe ich mich entschlossen, einen zweiten Server bei Hetzner zu mieten und alles nochmal neu zu installieren. Leider hat mir Hetzner die Einrichtungsgebühr für den neuen Server in Höhe von 100€ nicht erlassen. Zitat: „Ein bereits durchgeführter HW-Check zeigt keine HW-Fehler. Muss also ein Fehler an der Software sein, daher kann ich Ihnen bei einer Neubestellung preislich leider nicht entgegenkommen.”
Ich bekam also wie bestellt einen neuen EQ4 Server und dieses Mal in einem anderen Rechenzentrum. Eigentlich dürfte der Fehler jetzt nicht noch einmalmal auftauchen. Weit gefehlt, nach wenigen Tagen gab es den ersten Reset. Das Spiel mit dem Support begann von vorne und die Resets traten alle paar Tage auf:

Hetzner2

Nach einem Jahr bei Hetzner ist meine Geduld am Ende. Ich habe alles gekündigt und bin nun zu Strato umgezogen.

Wie ich oben schon beschrieben habe, kenne ich zwei zufriedene Hetzner-Kunden. Entweder ich habe ein unglaubliches Pech gehabt oder das Modell EQ4 ist mit falscher oder falsch konfigurierter Hardware ausgestattet.

dotnet Cologne 2011 fast ausgebucht

21.03.2011 19:10:00 | Stefan Lange

Nachdem letzte Woche Dienstag die Anmeldung für die dotnet Cologne 2011 freigeschaltet wurde, waren der Super Early Bird nach weniger als 5 Minuten und der Early Bird nach weniger als 3 Stunden weg. Auch das neu überarbeitete Anmeldesystem hat damit seinen ersten schweren Lasttest mit Erfolg bestanden.

Nun, eine Woche später ist die Konferenz schon fast ausgebucht – es sind nur noch 14 Plätze frei (Stand 19:00h). Heute haben wir die Sprecher und Vorträge nochmals aktualisiert, sodass sie nun fast komplett sind.

Wer also noch einen Platz bekommen möchte, sollte nicht mehr allzulange warten, sondern sich lieber gleich anmelden.

An dieser Stelle möchte ich auch allen Bewerbern für die zahlreichen Session-Vorschläge danken. Wir hatten sehr viel mehr Einreichungen als wir berücksichtigen konnten.

Alle Sprecher treten übrigens ohne Honorar an – auch dafür schon mal ein Dankeschön für das Engagement!

Insbesondere freut es mich, Bart De Smet als Speaker gewonnen zu haben. Bart ist Software Development Engineer im Cloud Programmability Team der Microsoft Corporation und wird Vorträge zum Reactive Extension Framework und zu LINQ halten. Ich habe ihn auf der VSone im Februar in München kennengelernt. Als wir ihm von der dotnet Cologne erzählten, war er sofort bereit seinen privaten Heimaturlaub Anfang Mai in Brüssel zu unterbrechen und zur Konferenz zu kommen.

Es ist schon toll zu sehen, wie gut das Konzept der Community Konferenz „von Entwicklern für Entwickler“ funktioniert.

POSTing Json data using the HttpClient from WCF Web API

21.03.2011 12:48:00 | Alexander Zeitler

If you need to POST Json data to your REST service, you can do this pretty straight forward using the HttpClient from the WCF Web APIs:

public CustomerDto Add(CustomerDto customerDto) {
	using(HttpClient httpClient = new HttpClient(_baseAddress)) {
		CustomerDto newCustomer = null;
		httpClient.DefaultRequestHeaders.Accept.Add(_json);
		JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
		byte[] customerBytes = Encoding.UTF8.GetBytes(jsonSerializer.Serialize(customerDto));
		using (MemoryStream stream = new MemoryStream(customerBytes)) {
			StreamContent customer = new StreamContent(stream);
			customer.Headers.ContentType = _json;
				using (HttpResponseMessage response = httpClient.Post("", customer)) {
				newCustomer = jsonSerializer.Deserialize<CustomerDto>(response.Content.ReadAsString());
			}
		}
		return newCustomer;
	}
}

where _json is

_json = new MediaTypeWithQualityHeaderValue("application/json");

The code applies to the WCF Web APIs Preview 3.

Update: You know what? It's even simpler using the new HttpContentExtensions and JsonContentExtensions:

public CustomerDto Add(CustomerDto customerDto) {
	using(HttpClient httpClient = new HttpClient(_baseAddress)) {
		CustomerDto newCustomer = null;
		httpClient.DefaultRequestHeaders.Accept.Add(_json);
		StreamContent customer = 
			customerDto.ToContentUsingDataContractJsonSerializer() as StreamContent;
			customer.Headers.ContentType = _json;
				using (HttpResponseMessage response = httpClient.Post("", customer)) {
				newCustomer = response.Content.ReadAsObject<CustomerDto>();
			}
		}
		return newCustomer;
	}

In case you're missing the Microsoft.Http.Extensions.dll: you need to fix the build output path inside the Microsoft.Net.Http.Extensions project to point to the common build directory.

Thanks to Glenn Block for pointing me to the Extensions.

DotNetKicks-DE Image

Die letzte Anmeldungs-Chance zur dotnet Cologne 2011

21.03.2011 12:13:45 | Albert Weinert

Letzte Woche schrieb ich dass die Anmeldepforten zur dotnet Cologne geöffnet sind.

Pünktlich um 14:00:00 Uhr  ging es los, um 14:00:05 Uhr war die erste Anmeldung eingetroffen und die Anmeldung mit der Nummer 100 war dann um 14:04:05 Uhr eingetroffen. Um 16:48:52 hat es dann Nummer 200 geschafft die Anmeldung abzuschicken und somit das Ende des Early Birds einzuleiten. Danach kühlte sich das ganze Etwas ab. Doch, dies ist der schnellste Tickerverkauf den die dotnet Cologne je hatte. Somit ist mit einem baldigen Ausverkauf zu rechnen.

Doch dies ist Deine Chance!

Zum Stand jetzt (21. März 2011, 12:15 Uhr) gibt es noch 14 freie Plätze, jedoch zum Normalpreis von 55 €. Doch wenn man sich das Aufgebot der Sprecher und Sessions ansieht ist dies ein echter No-Brainer und man sollte sich die Chance auf keinen Fall entgehen lassen.

Also wer noch nicht angemeldet ist, sollte dies sofort machen.

Technorati Tags: ,,,

Recap–MSBuild @ .NET UserGroup Frankfurt

21.03.2011 10:29:55 | Thorsten Hans

Am Donnerstag war ich bei der .NET UserGroup Frankfurt als Speaker zu Gast und habe dort die neuste Version meines MSBuild Vortrages gehalten. Die Anfahrt wurde leider etwas erschwert, weil es sich um Frankfurt rum doch ein wenig staute.

Neben mir ging es auch der Vielzahl der Teilnehmer so, wodurch das Meeting erst mit 20 Minuten Verspätung starten konnte… Die .NET UserGroup in Frankfurt ist wirklich eine coole Gruppe, die Aufgrund der Location natürlich sehr viele Besucher zieht.

Für alle, die nicht dabei sein konnten hier nochmals die Slides

Die Samples aus dem Vortrag findet ihr auf meinem Kiln Repository unter https://dotnetrocks.kilnhg.com/Repo/Conference-Sampels/2011/DNUG_FFM, alternativ könnt ihr euch hier eine ZIP herunterladen, die sowohl die Slides, als auch die Samples beinhaltet.

Wie man im SlideDeck sehen kann, habe ich auch noch ein paar aktuelle Community News verbreitet Kostja war so nett davon ein Foto zu machen. :D

Community News

Viel Spass beim Bauen!

 

Technorati Tags: ,,
DotNetKicks-DE Image

Wie bekommt man die Visual Studio 2010 SP1 Hilfe / MSDN in die Windows 7 Taskbar?

20.03.2011 17:14:00 | Alexander Zeitler

Will man die Visual Studio 2010 SP1 Hilfe bzw. MSDN an die Windows 7 Taskbar oder ins Root des Startmenüs pinnen, steht man vor dem Problem, dass dies nicht vorgesehen ist:

Visuual Studio 2010 Dokumentation

Auch Drag and Drop funktioniert nicht.

Die Lösung ist, den Microsoft HelpViewer an die Taskbar bzw. ans Startmenü zu pinnen.

Dieser liegt unter

C:\Program Files\Microsoft Help Viewer\v1.0\HlpViewer.exe

Will man sich ein bestimmtes Thema, z.B. Windows Azure, pinnen, geht man wie folgt vor:

Zunächst ruft man die entsprechende Seite in der MSDN auf.

Danach öffnet man die Eigenschaften der Seite:

Windows Azure

Nun kopiert man aus den Eigenschaften die Adresse:

WindowsAzure Properties

Diese sieht wie folgt aus:

http://127.0.0.1:47873/help/1-5608/ms.help?method=page&id=28BEDDC7-5D17-47B7-864C-95AD98E3835D&product=VS&productversion=100&locale=en-US&format=html&topicVersion=10&topicLocale=EN-US&embedded=true

Alles vor dem “?” kann man entfernen und ersetzt es durch

ms-xhelp:///

Somit ergibt sich:

ms-xhelp:///?method=page&id=28BEDDC7-5D17-47B7-864C-95AD98E3835D&product=VS&productversion=100&locale=en-US&format=html&topicVersion=10&topicLocale=EN-US&embedded=true

Nun erstellt man auf dem Desktop (oder wo auch immer) einen neuen Shortcut und gibt dort als Ziel die neue Adresse ein.

Damit lässt sich nun bequem das Thema direkt öffnen ohne Umwege über Favoriten oder die Suche.

DotNetKicks-DE Image

Der TFS ist klasse

20.03.2011 01:54:00 | Jürgen Gutsch

Meine gestrige Behauptung (im Beitrag Developement Infrastructure), den TFS klasse zu finden, stieß wohl auf einige Verwunderung:

Bjoern Rochel per Twitter:

Don't know what to think when I hear a dev say: "TFS is awesome". 2 me this feels like it is from a Fringe-esque parallel universe...

Auf meine Frage, was Björn den konkret am TFS schlecht findet erhielt ich folgende Punkte aufgezählt

  1. Die Versionskontrolle sei “ätzend” langsam (GetLatest?),
  2. der TFS pfuscht in den Projektdateien rum,
  3. Der TFS ist Solution-zentriert, für Micro-Workflows mit Feature-Branching ungeeignet.
  4. Vom Offline-Support will ich gar nicht erst anfangen.
  5. Es fehlt die Einfachheit von .gitignore
  6. Builds: TFSBuild.proj war nicht schön, aber Builds mit Workflows sind der Hammer -> Mit Kanonen auf Spatzen schiessen
  7. Darüber hinaus stört es wie geschlossen das System ist.
  8. Ist einfach ein alles oder nichts Ansatz.

Ein kleines Lob gab es von Björn immerhin:

Björn Rochel per Twitter

Ich find WorkItems und Reports darüber übrigens gar nicht schlecht. Leider vermiest der Rest mir das tägliche Arbeiten derart

Der wichtigste Kritikpunkt, der nicht nur von Björn genannt wurde, war der fehlende Offline-Support, bzw. die Tatsache, das es sich bei der Versionskontrolle des TFS um ein zentralisiertes System handelt und nicht um ein verteiltes System, wie z. B: das von Mercurial oder Git. Code kann mit dem TFS nicht lokal versioniert werden.

Zuerst…

… mal meine Sicht der obigen Kritikpunkte bevor ich schreibe, was ich am TFS so klasse finde:

  1. Kann ich innerhalb des Firmennetzes nicht nachvollziehen. Richtig ist, dass die Kommunikation des Team Explorers per Webservices stattfindet und über das Internet der SOAP-Overhead negativ spürbar ist. GetLatest ist dann allerdings IMO weniger langsam als alles was mit den Work Items zu tun hat.
  2. Ja, das ist ein Nachteil. Der gleiche Nachteil, den SVN mit den blöden .svn-Ordner hat
  3. Richtig, aber: In den meisten Produktentwicklungen die ich bisher gesehen habe, ist Feature-Branching kein Thema, auch da es isolierte Features voraussetzt. In Projekten die IMO in den meisten kleinen und mittleren Firmen entwickelt wird ist ein Feature mit der Anwendung verwebt. Die Entwicklung oder Änderung eines Features, setzt die Änderung des ganzen Produktes voraus. Das ist nicht schön, habe ich aber bisher – außer bei Projekten von Leuten die in der Community-Aktiv sind -  nicht anders erlebt.
  4. Richtig Offline Support gibt es nicht, da es wie gesagt, ein zentralisiertes System ist.
  5. Ehrlich gesagt, finde ich .gitignor nicht einfacher als der File Types Manager im TFS. .gitignore ist nur flexibler.
  6. Dem stimme ich 100%ig zu
  7. Ist es denn geschlossen? IMHO nein, allerdings wirkt es auf dem ersten Blick so. Der TFS lässt sich recht gut anpassen, erweitern und anprogrammieren. Wie alles bei MS ist das halt nicht gut Dokumentiert.
  8. Wie Punkt 7. wirkt es auf dem ersten Blick wirklich so. Aber wie ich gestern beschrieben habe, nutze ich weiterhin Hudson und MSBuild als Alternative zum Team Build.

DVCS vs. CVCS

Verteilte Versionskontrolsysteme (DVCS) haben selbstverständlich riesige Vorteile. Offline-Support und Feature-Branching wurden bereits genannt. Allerdings müssen die Vorteile auch erkannt, gekannt und akzeptiert werden. Die Arbeitsweise mit DVCS muss auch gelernt und verstanden werden.

Die Mehrheit der Entwickler kennen nur VSS, SVN, CVS und den TFS. Die Mehrheit der Manager sehen kein Vorteil, dass Ihr so wertvoller Sourcecode nicht zentral “kontrolliert” wird, sondern “unkontrolliert” auf unzähligen Repositories verteilt ist. Verteilte Systeme werden also – wenn nicht als Gefahr, dann doch - als zu Aufwendig und zu schwer zu kontrollieren angesehen.

In einem speziellen Fall wird es sogar als problematisch angesehen, dass die Softwareentwickler auf ihren eigenen Rechnern entwickel, statt in einer zentralisierten Entwicklungsumgebung ;-)

Verteilte Systeme sind im Firmenkontext noch nicht angekommen, bzw. auch nicht wichtig.

Aus dem Blickwinkel ist das zentralisierte System also kein Ausschlusskriterium des TFS für den Einsatz in einer Firma die Produktentwicklung macht.

Auch die verpfuschten das TFS-Binding in den Projektdateien ist kein Ausschlusskriterium, da der TFS für die Produktentwicklung in der Regel für längere Zeit eingesetzt wird, das System für alle Entwickler vorgeschrieben wird. Einmal eingerichtet, ist das TFS-Binding also kein Thema mehr.

Alle Entwickler haben mit dem gleichen Prozess und dem gleichen System zu arbeiten.

Nebenbei:

Ich schreibe hier aus der Sicht der Produktentwicklung, die länger als nur ein, zwei Jahre betrieben wird. Produktentwicklung kann auch mehr als 15 Jahre gehen, wie es bei meinem letzten Arbeitgeber der Fall war.

Projektarbeit und die Arbeit an Open Source Projekten ist kurzlebiger, hier wirkt sich ein starres System mit festen Prozessen negativer aus, als in der Produktentwicklung. Bei der Projektarbeit wechselt das Team eher als bei der Produktentwicklung. Im letzteren wechseln zwar vereinzelte Team.-Mitglieder, aber es ist dennoch immer über Jahre das Softwareentwicklungsteam.

Warum der TFS klasse ist:

Der TFS ist aufwendig einzurichten. Wenngleich die Installation und die Grundkonfiguration mit der 2010er Version so leicht wie die Installation des Visual Studio 2010 ist, kann es dennoch eine Woche oder mehr gehen, bis der TFS an die vorhandenen Prozesse angepasst ist. Die beiden vordefinierten Prozesse sind wohl in den seltensten Fällen einsetzbar.

Der TFS ist deswegen klasse, weil er nicht nur Versionskontrolle ist. Die große Stärke ist aus meiner Sicht, dass die Work Items stark mit der Versionskontrolle Verknüpft sind.

Hätte ich eine so starke Verknüpfung mit Mercurial und einem entsprechenden anderen Bug-Tracking, würde ich sofort dieses empfehlen. Auch wenn der Schulungs- und Akzeptanzaufwand für verteilte Versionskontrollen sehr hoch sein könnte .

Mit Kiln habe ich schon eine sehr starke Kombination, aber so intuitiv und so komfortabel wie im TFS ist es noch nicht.

Der TFS ist deswegen klasse, weil ich über die Work Items sofort sehen kann, welcher Code geändert worden ist. (Ja, das geht mit anderen Systemen auch) Der TFS ist klasse, weil ich in jeder Zeile Code sehen kann aus welchem Grund sie erzeugt oder geändert worden ist. Die Work Items sind klasse. Und der definierbare Prozess hinter den einzelnen Work Items ist klasse. Klasse ist auch, dass die Work Items von Leuten bedient werden können, die mit Web-GUIs nicht so zurecht kommen. Als Entwickler finde ich den TFS klasse, das Versionskontrolle und Work Items im Visual Studio integriert ist, das ich alles in einer Umgebung kompakt beisammen habe.

Wenn ich mich also in einer Umgebung befinde, die nicht der Firma FogCreek Software entspricht und dem entgegen einem Abbild von Roland Weigelts Community Pyramide entspricht, ist der TFS ideal: Einfach zu bedienen, einfach zu verstehen, feste Prozesse und alles ist integriert.

Community Pyramide:

Auf der dotnet Cologne 2010 zeigte Roland Weigelt in der Keynote eine Pyramide mit Softwareentwicklern, an deren Spitze sich diejenigen Entwickler befinden, die aktiv an der .NET-Community teilnehmen. Das sind zumindest auch diejenigen die auch den Begriff ALT.NET irgendwo mal gelesen haben. ;-)

Ich möchte die anderen Systeme nicht schlecht machen, …

…ganz im Gegenteil, aber ich sage auch nicht, dass der TFS generell auf keinen Fall genutzt werden sollte. Im Gegenteil sollte der TFS auch immer ernsthaft in Betracht gezogen werden. Nicht nur die Versionskontrolle ist wichtig, sondern auch das drum herum und abhängige Infrastruktur und die Leute die es nutzen sollen.

Ich verstehe, warum Björn, Stefan Lieser, Golo Roden und Ilker Cetinkaya den TFS ablehnen. Ich verstehe, warum DVCS als so wichtig angesehen werden.

Wie bereits geschrieben, nutze ich privat Mercurial und finde ihn und die Arbeit mit ihm ebenfalls absolut klasse.

Würde ich eine Versionskontrolle in einer Umgebung einführen, in der es nur Softwareentwickler gibt, hätte ich mich bei meinem Arbeitgeber möglicherweise nicht so schnell für den TFS entschieden. Aber bei der Produktentwicklung hängt noch etwas mehr dran als nur das schreiben von Code und dessen Versionierung: Supportabteilung, Testabteilung, Produktmanager. Klasse ist, dass man mit dem TFS alle schnell integrieren kann. Der Schulungsaufwand für alle beteiligten ist ebenfalls fast null.

Und Team Build?

Hierzu schreibe ich demnächst mehr in einem weiteren Beitrag.

DotNetKicks-DE Image

Using the new WCF Web APIs HttpClient with ASP.NET Forms Authentication

19.03.2011 13:52:00 | Alexander Zeitler

Recently I posted how to use ASP.NET Forms authentication with the new WCF Web APIs (german version).

In this posting I have been using the classic HttpWebRequest / HttpWebResponse.

If you take a look into the WCF Web APIs source code, you’ll find a new Version of the HttpClient which is optimized to work with the new APIs.

I modified my sample from my above Posting to make the client use the new HttpClient instead of the old stuff:

CookieContainer cookieContainer = new CookieContainer();
using (HttpClient client = new HttpClient("http://localhost:44857/")) {
	HttpClientChannel clientChannel = new HttpClientChannel();
	clientChannel.CookieContainer = cookieContainer;
	client.Channel = clientChannel;
	HttpContent loginData = new FormUrlEncodedContent(
		new List<KeyValuePair<string, string>>
			{
				new KeyValuePair<string, string>("Username", "foo"),
				new KeyValuePair<string, string>("Password", "bar")
			}
		);
	client.Post("login", loginData);
}

string result = string.Empty;
using (HttpClient client = new HttpClient("http://localhost:44857/contact/")) {
	HttpClientChannel clientChannel = new HttpClientChannel();
	clientChannel.CookieContainer = cookieContainer;
	client.Channel = clientChannel;
	client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
	HttpResponseMessage response = client.Get("1");
	result = response.Content.ReadAsString();
}

JavaScriptSerializer jsonDeserializer = new JavaScriptSerializer();
ContactDto contact = jsonDeserializer.Deserialize<ContactDto>(result);
Console.WriteLine(contact.Name);
Console.ReadLine();

RESTful clients straight forward now ;-)

Download the new version here: WcfHttpMvcAuth.zip (9.62 mb)

DotNetKicks-DE Image

Nachlese zum Treffen der .NET Usergroup Dresden vom 17.03.2011

18.03.2011 19:13:00 | Martin Hey

Gestern gab es gleich zwei Premieren bei der .NET Usergroup Dresden.

Premiere 1: Wir haben das erste Mal ein Coding Dojo durchgeführt. 18:00 Uhr ging es los. Nachdem beim letzten Usergroup-Treffen die ein oder anderen Fragen auch in Richtung testgetriebene Entwicklung und die Sinnhaftigkeit gingen bin ich in ein paar einleitenden Worten darauf eingegangen, was testdriven eigentlich bedeutet und wie man dabei vorgeht.

Ausgehend davon wurde der Rahmen für den Abend gesteckt. Ich erklärte die Grundbegriffe von Coding Dojos und weil es für viele das erste Dojo war, begannen wir mit der recht einfachen Kata FizzBuzz. Im Vordergrund für diesen Abend stand einfach nur, allen ein Gefühl für TDD zu geben und die Angst vor dem Unbekannten "Coding Dojo" zu nehmen. Zweite Kata des Abends sollte nach einer Abstimmung Kata Potter sein, die aber nach unterschiedlichen Lösungsvorschlägen und Herangehensweisen irgendwann dann abgebrochen wurde.

Für mich war es das erste mal als Sensei und ich habe ein paar wertvolle Schlüsse ziehen können. Zunächst habe ich mich sehr gefreut, dass sich auch Usergroup-Teilnehmer, die eigentlich als Muttersprache VB.NET sprechen (wie sie es selbst genannt haben) in einem C#-Projekt mitgearbeitet haben, auch wenn "dieses komische Semikolon immer" gestört hat. Mir hat es sehr gut gefallen, dass eben nicht nur ein Vorturner da war, sondern dass wir die Gelegenheit hatten, vom Wissen aller zu profitieren, die sich freiwillig gemeldet haben, an der Kata mitzumachen. Und hier hat sich wieder gezeigt, dass es wichtig ist, nicht vorn still vor sich hin zu programmieren, sondern alle an den Gedanken teilhaben zu lassen.

Es gab aber auch ein paar Lehren für mich: Bei einer Gruppengröße von 20 Teilnehmern ist es recht kompliziert alle bei der Sache zu halten. Und, es hat sich herausgestellt, dass es wichtig ist, auch im Dojo die Schritte Red-Green-Refactor alle durchzuführen und es nicht auf Red-Green-Vielleicht-Refactor zu beschränken. Dem resultierenden Code merkt man nämlich an, dass er dringend ein Refactoring benötigt. Und zu guter Letzt ist es wichtig, nicht blind drauf los zu programmieren, sondern sich auch zu Beginn schon mal Gedanken darüber zu machen, in welche Richtung es gehen soll. Denn was nutzen 7 grüne Tests, wenn man der Lösung noch nicht wirklich näher gekommen ist und erst dann überlegt, wie man das Problem denn lösen könnte.

Zusammenfassend: Es war ein gelungener erster Dojo-Abend. Ich denke, wir werden das auch weiter fortführen und gelegentlich Dojo-Abende einstreuen und die Schlüsse die ich und auch die anderen aus diesem Abend ziehen konnten werden dann sicher auch Eingang finden. Die Resonanz war zumindest eindeutig positiv. Und nicht zuletzt habe ich mich auch sehr darüber gefreut, neben den vielen bekannten Gesichtern wieder mal ein paar neue Teilnehmer begrüßen zu dürfen.

Ach ja - Premiere 2: Das Treffen fand das erste Mal bei Saxonia Systems statt und es war ein guter Einstand. Offenbar können Softwareentwickler aber mit Gemüse nicht allzu viel anfangen, denn obwohl die freundlicherweise gesponserten belegten Brötchen im wahrsten Sinne weggingen wie warme Semmeln, war die Gemüseplatte fast unberührt.

Developement Infrastructure

18.03.2011 14:46:00 | Jürgen Gutsch

Meine heutigen Fragen und Anmerkungen auf Twitter, welche Team Build mit der Workflow Foundation betrafen und die problematische Migration von SVN zum TFS (die ich ebenfalls auf Twitter kommentiert habe) mag wohl den Eindruck gehabt haben, dass die von mir genutzte Developement Infrastructure nur auf Microsoft-Technologie basiert.

Weit gefehlt :-)

Developement Infrastructure

Aber fangen wir mal von ganz vorne an. Wie sieht eine Developement Infrastructure aus?

  1. Das wichtigste Werkzeug ist natürlich das Visual Studio 2010 mit allen seinen Plug-Ins (die bei mir mehrheitlich von JetBrains stammen)
  2. Als nächste kommt die Versionsverwaltung, wie z.. B: Git, Mercurial, SVN oder eben den TFS.
  3. Ebenfalls wichtig halte ich die Integration der Versionsverwaltung in das Visual Studio. Hier kommen z. B: die Tortoise-Varianten und eben der Team Explorer zum Einsatz
  4. Ebenfalls wichtig ist ein Build-Server der mit der Versionsverwaltung zurecht kommt, Änderungen mitbekommt und daraufhin einen sog. Continous Integration Build erzeugt und die automatisierten Tests ausführt. Optimaler weise ist der auch für den Nightly-Build zuständig, der die täglich, frische Version für die Tester oder den Kunden auswirft
    Als Buildserver wird Team City, Hudson, Cruis Control oder eben Team Build eingesetzt.

Idealerweise gibt es einen Server der für die Versionsverwaltung zuständig ist und einen der nur die Builds macht. Das gilt auch für den TFS: der TFS und Team Build sollten auf zwei verschiedenen Servern installiert werden.

Meihne Einstellungen zum TFS

Der TFS ist klasse. Ich habe seit der ersten Version des TFS mit diesem gearbeitet, aber ich nie Team Build als Build-Server verwendet. Der TFS ist eine ideale Versionsverwaltung für Firmen, die ein bisschen mehr Kontrolle wollen, als es andere Systeme bieten. Mit dem Integrierten Bug-Tracking funktioniert auch das Projektmanagement hervorragend. Agile Softwareentwicklung ist mit dem TFS hervorragend machbar, solange man die vorgegebenen Prozesse etwas anpasst oder sich an die Prozesse des TFS anpasst. Sobald der TFS allerdings mal eingerichtet ist, ist es aus meiner Sicht im Moment das beste System auf dem Markt. Mit Team Build und Lab Management bietet es einige weitere (im Prinzip) hervorragende Features, die ich bisher leider nie selber verwendet habe.

Wie Albert Weinert allerdings ganz richtig per Twitter eingewendet hat: “wenn du in der MS Welt bleibst mag es TFS ja nett sein”

Privat würde ich den TFS allerdings nie verwenden. Das liegt nicht nur an den Lizenzkosten, sondern auch am Overhead den der TFS mit sich bringt, der für einen alleine oder auch zu zweit einfach zu groß ist. Das geht nämlich auch einfacher und ohne dass man mehrere Tage damit verbringen muss, dass System anzupassen.

Private Infrastructure

Privat nutze ich aktuell vorzugsweise Mercurial als Versionsverwaltung. Für meine privaten Projekte auf meinem eigenen Server und Kiln, für öffentliche Projekte auf BitBucket.

Das Svn2Tfs Migration Tool wird ebenfalls auf BitBucket als Open Source zur Verfügung gestellt

Ich nutze auch Git unter GitHub um vorhandene Projekte zu Forken, zu beobachten oder mich daran zu beteiligen.

Als Buildserver kommt Hudson, das ich als schnellstes, einfachstes und bequemsten zu installierenden Buildserver kennengelernt habe. TeamCity hat mir von Anfang an zu viele Ressourcen benötigt, ist zwar zwar intuitiv und schnell eingerichtet, benötigt aber sehr viel Arbeitsspeicher, was allerdings auf einem privat gehosteten Server rar sein kenn. CruiseControl ist bei mir wegen der umständlichen Konfiguration gleich ausgeschieden.

Hudson dagegen kann erst mal fast nichts (aus .NET-Entwicklersicht, ist es fast nichts, wenn es nur Javaprojekte bauen kann), ist aber durch unzählige Plug-Ins erweiterbar, die direkt in der GUI aktiviert und konfiguriert werden können. Hudson belauscht alle meine Repositories und führt bei Änderungen sofort einen Continous Integration Build aus, führt alle Tests (mit NUnit) automatisiert aus und erstattet mir im Fehlerfall ausführlich Bericht.

Geschäftliche Infrastructure

Als ich im Geschäft angefangen habe gab es einen exotisch installierten SVN-Server… und immerhin gab es einen SVN-Server :-)

Hudson war schnell installiert und Continous Integration war somit eingerichtet. Release Builds wurden noch mit FinalBuilder gemacht, was bis dahin auch einigermaßen gut funktionierte…

Bis Jürgen kam… Und den Buildprozess (auch auf den Entwicklungsrechnern) beschleunigte, indem er alle Projektreferenzen durch Assembly-Referenzen ersetzte. Dadurch wurde nicht nur der Lokale Build beschleunigt, sondern theoretisch auch der Build unter FinalBuilder. Problem nur: Durch die fehlenden Projektreferenzen mussten die Projektabhängigkeiten von Hand gesetzt werden. Was Hudson und MSBuild mitmacht, wurde von FinalBuilder ignoriert, ganz egal ob der FinalBuilder per Visual Studio baut, oder per MSBuild. FinalBuilder war also für mich, unter anderem auch deswegen, für mich gestorben.

Hätte ich (wie es Stefan Lieser per Twitter anmerkt) die Build-Reihenfolge mit mehreren einzelnen Solutions vorgenommen, statt mit einer großen Solution, hätte ich den Build-Prozess im Final Builder unter Umständen immer wieder anpassen müssen, wenn sich die Projektstruktur ändert. In der aktuellen Entwicklung konnte sich die Struktur aber laufend ändern, da auch eine ganze Menge Testprojekte durch die neu eingeführten Unit-Tests hinzukamen oder die Unit-Tests zu Refactorings zwingen konnten.

Die Lösung war, den FinalBuilder-Prozess mit MSBuild sauber und generisch nachzubilden. Ein paar MSBuild-Tricks waren auch in den Projektdateien nötig und der Prozess war getan. Sehr Dankbar bin ich übrigens dem Thorsten Hans, der mich dabei mit wertvollen Tipps unterstützt hat.

Desweiteren war der Build mit MSBuild doppelt so schnell, als der mit FinalBuilder. Der Overhead der Überladenen GUI des FinalBuilder macht sich im Vergleich zur Konsole bemerkbar. Der Aufruf: “msbuild buildall.proj” erzeugt nun aus den Sourcen, in einer halben Stunde vier Server-Produktvarianten und sechs Client-Produktvarianten, inklusive WiX-Setup-Projekten.

Wir haben nun also einen exotischen SVN-Server, CI mit Hudson und MSBuild und einen Build-Prozess mit MSBuild.

Bleibt das Problem mit dem Bug-Tracking das irgendwie in einem Sharepoint zusammengebastelt war. Eine direkte Verknüpfung zwischen Änderungen am Code und Bug-Tracking gab es nicht. Im SVN wurde nur eine Ticket-ID mitgespeichert.

Die Lösung war der TFS, indem die komplette History aus dem SVN migriert werden sollte

Hier kommt das oben erwähnte Svn2Tfs Migration Tool zum Einsatz, das nacheinander alle Revisionen komplett mit Kommentaren vom SVN lädt und in den TFS einspielt.

Existierende Migrationstools funktionierten aufgrund des exotischen SVN-Servers nicht und brachen mit Fehlern ab. Woraufhin ich selber ein Migrationstool schrieb. Innerhalb von vier Tagen waren ca. 8100 Revisionen von 200.000 Dateien migriert.

Die Migration der alten Tickets als neue WorkItems erfolgte dann relativ stupide per Excel

Stand Heute: TFS als Versionsverwaltung, TFS als Bug-Tracking, Hudson für die CI-Builds und MSBuild für den komplett-Build.

Team Build

Jetzt wo der TFS installiert und eingerichtet ist, war die Überlegung, die CI-Builds auch per Team Build zu machen, was im ersten Schritt aber schon daran scheiterte, dass die Build-Prozesse mit der Workflow Foundation 4 so komplex sind, dass es auf die Schnelle nicht möglich war dem Team Build beizubringen, dass wir nicht MSTest, sondern NUnit als Unit-Test Framework verwenden.

Schade eigentlich, den ich verspreche mir von Team Build, dem Lab Management und den Codet-UI-Tests die Testabteilung stärker in den TFS-Prozess zu integrieren.

Es fehlt also eine Integration von Manuellen Tests, automatisierten Akzeptanz-Tests und UI-Tests

Das werde ich möglicherweise nun anders lösen müssen.  

Dafür war FittNesse eine Idee. Für weitere Ideen bin ich absolut offen. :-)

Fazit

Somit entwickle ich zwar auf Microsoft Plattformen, nutze aber nicht nur Microsoft Technologien.

Stichwort: ALT.NET (unter anderem das Motto der letztjährigen See# Party)

Microsoft entwickelt immer bessere Developement Infrastructure. Mit jeder Version wird der TFS besser. Mit jeder Version wird das Visual Studio und seine Tools besser. Aber im Moment ist man stellenweise immenroch besser mit alternativen Tools und Frameworks dran ;-)

DotNetKicks-DE Image

Using WPF and Silverlight to fight Cancer :: eBay Auction

18.03.2011 10:31:17 | Jens Häupel

Gregor Biswanger (MVP für Client App Dev, Solution Architect & Silverlight Experte) hat seit gestern Nachmittag eine Aktion auf seinem Blog unter dem Titel „WPF 4 und Silverlight 4 gegen Krebs!“ gestartet. Bei seinem letzten Besuch in Redmond hatte er seine DVD von den WPF-, Silverlight- und Expression Blend-Produktteams signieren lassen. Diese signierte DVD wird auf eBay versteigert und der Erlös geht direkt an die Deutsche Krebshilfe e.V.. Weitere Informationen auf seinem Blog unter: http://www.dotnet-blog.net/post/2011/03/15/WPF-4-und-Silverlight-4-gegen-Krebs!.aspx

Also dann, wer helfen kann und will, bitte mitbieten.

Keyboard Jedi unter x64

17.03.2011 21:40:00 | Alexander Zeitler

Keyboard Jedi ist ein Tool von Roy Osherove, das Tastenkombinationen am Bildschirm als Overlay anzeigt.

Das ist extrem praktisch für Live-Demos, da die User auch sehen, welche Tastenkombinationen der Presenter eintippt (Stichwort: VS / Resharper etc.):

Keyboard Jedi

Außerdem kann man den Shortcuts auch Memos anheften und diese in die Zwischenablage kopieren:

Keyboard Jedi Memos

In Roys Post sind noch weitere Features erklärt, wie z.B. die Einschränkung, nur bestimmte Programme zu überwachen.

Leider hat Keyboard Jedi das Manko, dass es nur unter x86 funktioniert.

Allerdings hat James Kovacs bereits 2008 ein Tutorial veröffentlicht, wie man es mittels coreflags und IL(D)ASM  unter x64 zum Laufen bekommt.

Leider hat James keine x64-exe bereitgestellt (die Gründe hierfür nennt er am Ende des Postings).

Da ich das Tutorial nun (dank Festplatten-Crash) bereits zweimal durchgearbeitet habe, stelle ich hier nun die Variante zur Verfügung, die sowohl unter x86 als auch unter x64 läuft:

keyjedi.zip (41.30 kb)

DotNetKicks-DE Image

Gregor, WPF 4 und Silverlight 4 gegen Krebs!

17.03.2011 19:23:00 | Alexander Zeitler

Leider gibt es keine Anwendung in WPF 4 und Silverlight 4, die diese Krankheit heilen könnte.

Allerdings können wir mit finanziellen Mitteln helfen den Krebs zu bekämpfen.

Deshalb hat Gregor Biswanger (MVP Client App Dev) auf eBay eine Aktion gestartet und versteigert die neue DVD „WPF 4 und Silverlight 4“.

Bei dieser DVD handelt es sich nicht um die gewöhnliche Kaufversion, sondern um ein exklusives Stück. Die DVD wurde vom Microsoft WPF-, Silverlight- und Expression Blend-Produktteam für diesen guten Zweck signiert.

Der Erlös geht direkt an die Deutsche Krebshilfe e.V.

WPF 4 / Silverlight 4 signiert

Weitere Details zur Auktion findet Ihr in Gregors Blog Post.

DotNetKicks-DE Image

.NET User Group Karlsruhe: Die Machine, Fakes und ich

17.03.2011 19:12:00 | Alexander Zeitler

.NET Usergroup Karlsruhe Logo

Am 24.03.2011 um 18:00 Uhr findet das nächste Treffen der .NET Usergroup Karlsruhe (XING-Gruppe der .NET Usergroup Karlsruhe) statt.

Thema

BDD mit Machine.Specifications und Machine.Fakes

Details zum Thema

Habt Ihr Euch schon mal gefragt was dabei rauskommt, wenn man Behavior Driven Development, Unittesting, Mocking und Dependency Injection in einen Topf wirft und kräftig schüttelt?

In diesem Vortrag zeigt Björn Rochel die beiden Open Source Frameworks Machine.Specifications und Machine.Fakes, die zusammen genau diese Konzepte miteinander kombinieren. Dabei möchte er insbesondere aufzeigen wie die Frameworks eingesetzt werden können, um einfacheren und besser strukturierten Testcode zu ermöglichen und typische Unittesting-Fallstricke zu vermeiden.

Über den Sprecher

Björn Rochel arbeitet als Architekt für .NET basierte Lösungen bei der InterComponentWare AG. Hauptsächlich treibt er sich dabei im Frontend rum und macht sich Gedanken rund um die Themengebiete Composite Clients und Presentation Patterns, aber auch das Thema Behavior Driven Development hat ihn nicht mehr losgelassen, seit er das erste mal davon gehört hat.
Mit xUnit.BDDExtensions (https://github.com/BjRo/xunitbddextensions) pflegt er sein eigenes Context Specification Framework.
Des Weiteren ist er ein Gründungsmitglied der .NET Online Usergroup (http://www.onlineusergroup.de). 
Ihr findet seinen Blog unter http://www.bjro.de.

Teilnahme

Bitte meldet Euch wieder via XING an, die Location ist wieder DJK-Ost:

DJK-Ost
Friedrichstaler Allee 52
76131 Karlsruhe

Anfahrt: http://www.djk-ost.de/anfahrt.htm

DotNetKicks-DE Image

Das neue Visual Studio LightSwitch Beta 2 jetzt verfügbar und live auf Tour

17.03.2011 11:41:29 | Peter Kirchner

Microsoft Visual Studio LightSwitch, das neueste Mitglied der Visual Studio-Produktfamilie nähert sich der Fertigstellung: Ab sofort steht der Download für alle MSDN-Abonnementen zur Verfügung. Ab morgen, dem 17. März 2011 können dann alle Entwickler die Beta 2 Version auf der offiziellen deutschen Website herunterladen - und dank „Go-Live“-Lizenz bereits für erste Projekte produktiv nutzen! Ab dem 21. März stellt Microsoft das neue Tool auf  einer bundesweiten kostenlosen Launch-Roadshow der Entwicklergemeinde vor. 

image

Mit Visual Studio LightSwitch können maßgeschneiderte Geschäftsanwendungen für den Desktop, das Web und die Cloud einfach und schnell entwickelt werden.  LightSwitch steht dabei in der Tradition von Microsoft Access und FoxPro, und kombiniert das erprobte Konzept dieser Entwicklungssysteme mit aktuellen Technologien wie .NET,  Silverlight, Windows Communication Foundation und SQL Server.

Zentral sind dabei nach wie vor der flexible Zugriff auf zahlreiche businessrelevante  Datenquellen und die Erstellung von benutzerfreundlichen Eingabemasken und Auswertungen. Zudem bietet LightSwitch eine wesentlich höhere Flexibilität als bisherige Tools: Anwendungen können auf dem Desktop oder zentral auf einem Webserver ausgeführt werden. Auf Wunsch können LightSwitch-Applikationen zudem auf einfachste Weise in der Cloud betrieben werden – ein Deployment auf Microsofts Cloud-Angebot Windows Azure ist integriert. Damit können Entwickler hochskalierbare Anwendungen in kürzester Zeit weltweit bereitstellen.

Weitere Highlights sind der problemlose Zugriff auf SharePoint-Datenquellen,  der integrierte Export zu Office-Programmen wie beispielsweise Excel und die Integration der modernen Sourcecode-, Bug- und Aufgabenverwaltung Visual Studio Team Foundation Server. Mit eigenen Erweiterungen kann LightSwitch an spezielle Erfordernisse angepasst werden. Zudem lässt sich dank Silverlight das grafische Design der Anwendung flexibel modifizieren, um beispielsweise ein firmenspezifisches Look & Feel zu realisieren.

Wer gleich los legen möchte, kommt am besten auf eine der deutschen Launch-Veranstaltungen: Applikationsentwickler, Entwicklungsleiter, Freiberufler, Consultants und Access-Entwickler und Poweruser können sich auf einer Road-Show quer durch Deutschland (München, Köln, Hamburg, Bad Homburg, Karlsruhe) in praxisnahen Vorträgen informieren, wie sie Applikationen für ihre Kunden in kürzerer Zeit und mit weniger Stress entwickeln können. Weitere Informationen gibt es hier: www.microsoft.de/visualstudio/rad

Microsoft plant die Veröffentlichung der finalen Version von LightSwitch noch in diesem Jahr, Preise stehen noch nicht fest.

Kapitel 4: NumberFlicker Bugfix

17.03.2011 09:09:16 | Peter Nowak

Während es in der finalen Version des Buches noch funktionierte, scheint nun der NumberFlicker aus Kapitel 4 nicht mehr zu funktionieren. Man bekommt die Zahl des benutzerdefinierten Steuerelements in der Ausführung nicht dargestellt.

Zeit also diesen Bug zu fixen.

Zuerst wurde die Variable in der NumberFlicker.xaml.cs-Datei in eine DependencyProperty geändert, damit die Datenbindung sauber funktioniert.

Der geänderte Quellcode sieht nun, wie folgt aus:

 1:   public static readonly DependencyProperty
NumberValueProperty = 
 2:  DependencyProperty.Register("NumberValue", typeof(int), typeof(FrameworkElement), new PropertyMetadata(0));
 3:  
 4:  public int NumberValue
 5:  {
 6:  get 
 7:  { 
 8:  return (int)
GetValue(NumberValueProperty);
 9:  }
 10:  set
 11:  {
 12:  if (value ==
10)
 13:  {
 14:  value = 0;
 15:  }
 16:  if (value ==
-1)
 17:  {
 18:  value = 9;
 19:  }
 20:  SetValue(NumberValueProperty, value);
 21:  NotifyPropertyChanged("NumberValue");
 22:  }
 23:  }

 

Zusätzlich war eine Änderung am XAML Markup notwendig, in welcher die Bindungsdeklaration angepasst, wie auch die Vordergrundfarbe des TextBlock-Elements deklariert wurde.

Die geänderte Zeile sieht nun, wie folgt aus:

<TextBlock x:Name="numberTextBlock" TextWrapping="Wrap" Text="{Binding
NumberValue}"  FontSize="64" FontFamily="Segoe
WP" Margin="-30,-39,-30,-30" TextAlignment="Center" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Black" />

Zwar ist damit immer noch nicht die Anzeige im Designer des Visual Studio möglich, jedoch ist das Steuerelement wieder benutzbar.

Die aktualisierte Variante gibt es hier als Download:



This posting is provided "AS IS" with no warranties, and confers no rights.

Visual Studio LightSwitch und Team Foundation Server erleben

16.03.2011 16:04:19 | Jens Häupel

Ab 21. März, jeweils ab 15 Uhr, begrüßt Sie Uwe Baumann auf der

RAPID APPLICATION DEVELOPMENT ROADSHOW 2011

Hier können Sie Visual Studio LightSwitch 2011 (Beta), Team Foundation Server 2010 und Windows Azure live erleben. Sprecher sind u.a. Christian Binder und Bernhard Frank.

image

Das neue Visual Studio LightSwitch Beta 2 jetzt verfügbar und live auf Tour

16.03.2011 14:04:55 | Oliver Scheer

Microsoft Visual Studio LightSwitch , das neueste Mitglied der Visual Studio-Produktfamilie nähert sich der Fertigstellung: Ab sofort steht der Download für alle MSDN-Abonnementen zur Verfügung. Ab morgen, dem 17. März 2011 können dann alle Entwickler die Beta 2 Version auf der offiziellen deutschen Website herunterladen - und dank „Go-Live“-Lizenz bereits für erste Projekte produktiv nutzen! Ab dem 21. März stellt Microsoft das neue Tool auf  einer bundesweiten kostenlosen Launch-Roadshow der Entwicklergemeinde vor.  Mit Visual Studio LightSwitch können maßgeschneiderte Geschäftsanwendungen für den Desktop, das Web und die Cloud einfach und schnell entwickelt werden.  LightSwitch steht dabei in der Tradition von Microsoft Access und FoxPro, und kombiniert das erprobte Konzept dieser Entwicklungssysteme mit aktuellen Technologien wie .NET,  Silverlight, Windows Communication Foundation und SQL Server. Zentral sind dabei nach wie vor der flexible Zugriff auf zahlreiche businessrelevante  Datenquellen und die Erstellung von benutzerfreundlichen Eingabemasken und Auswertungen. Zudem bietet LightSwitch eine wesentlich höhere Flexibilität als bisherige Tools: Anwendungen können auf dem Desktop oder zentral auf einem Webserver ausgeführt werden. Auf Wunsch können LightSwitch-Applikationen zudem auf einfachste Weise in der Cloud betrieben werden – ein Deployment auf Microsofts Cloud-Angebot Windows Azure ist integriert. Damit können Entwickler hochskalierbare Anwendungen in kürzester Zeit weltweit bereitstellen. Weitere Highlights sind der problemlose Zugriff auf SharePoint-Datenquellen,  der integrierte Export zu Office-Programmen wie beispielsweise Excel und die Integration der modernen Sourcecode-, Bug- und Aufgabenverwaltung Visual Studio Team Foundation Server. Mit eigenen Erweiterungen kann LightSwitch an spezielle Erfordernisse angepasst werden. Zudem lässt sich dank Silverlight das grafische Design der Anwendung flexibel modifizieren, um beispielsweise ein firmenspezifisches Look & Feel zu realisieren. Wer gleich los legen möchte, kommt am besten auf eine der deutschen Launch-Veranstaltungen: Applikationsentwickler, Entwicklungsleiter, Freiberufler, Consultants und Access-Entwickler und Poweruser können sich auf einer Road-Show quer durch Deutschland (München, Köln, Hamburg, Bad Homburg, Karlsruhe) in praxisnahen Vorträgen informieren, wie sie Applikationen für ihre Kunden in kürzerer Zeit und mit weniger Stress entwickeln können. Weitere Informationen gibt es hier: www.microsoft.de/visualstudio/rad Microsoft plant die Veröffentlichung der finalen Version von LightSwitch noch in diesem Jahr, Preise stehen noch nicht fest....(read more)

ShareCamp 2011

16.03.2011 13:16:58 | Thorsten Hans

Nach der erfolgreichen Erstauflage in 2010 wird auch dieses Jahr wieder das ShareCamp stattfinden. Das ShareCamp ist eine Communityveranstaltung rund ums Thema SharePoint2010.

Logo_born2share2011

Hingegen den typischen Konferenzen wird das ShareCamp in Form eines BarCamps durchgeführt. Kurz erläutert bedeutet dies, dass jeder Teilnehmer des BarCamps zur aktiven Teilnahme an der Veranstaltung aufgefordert ist.

GruppenfotoOffene Agenda

Analog zur Vorjahresveranstaltung findet das ShareCamp 2011 in der Microsoft Deutschland Zentrale in Unterschleißheim am 14. und 15.05.2011 statt. Das ShareCamp richtet sich an keine feste Zielgruppe, was bedeutet dass für jeden Geschmack etwas dabei sein sollte, denn schließlich bestimmen die Teilnehmer ja die Agenda.

SharePoint Vorträge von bekannten SpeakernNetworking / Fachausstellung

Also egal ob ihr

  • SharePoint Anwender
  • SharePoint Administrator
  • SharePoint Berater
  • SharePoint Entwickler
  • SharePoint Interessent

seit, meldet euch an und nehmt an der größten deutschen Communityveranstaltung zum Thema SharePoint teil.

SharePoint2010 KnowHowDiskussionsrunden

Hier geht’s zur Anmeldung!

 

DotNetKicks-DE Image

Ab in die Cloud

16.03.2011 10:04:18 | Peter Nowak

Eines der Basiskonzepte von Windows Phone 7 ist es, das Daten und Operationen in die Cloud ausgelagert werden. Ob man es gut findet oder nicht, ist je nach Anwendungsfall zu unterscheiden. Fest steht jedoch, dass man sich mit dem Thema auseinandersetzen sollte.

Aus diesem Grund verweisen wir gerne auf den Microsoft TechSummit Cloud im März/April in 6 Metropolen.

image001

Heiter bis wolkig: Microsoft TechSummit Cloud – die Roadshow für Developer & IT Professionals

Cloud Services sind in aller Munde – aber ist das wirklich etwas für meine Firma? Welche Dienste gibt es?
Was ist der Unterschied zwischen SaaS, PaaS, IaaS und was ist mit Public und Private Cloud? Ist das Ganze eigentlich sicher? Muss ich als Entwickler oder Administrator alles neu lernen? Und was hat Microsoft eigentlich mit Cloud zu tun?

Antworten hierzu gibt es auf unserer Roadshow Microsoft TechSummit Cloud.

Vom 28. März bis zum 8. April 2011 touren Experten von Microsoft TechNet und MSDN durch sechs deutsche Metropolen um Best Practices und technische Hintergründe zu den neuesten Microsoft Cloud-Technologien zu vermitteln und Anwenderfragen zu beantworten.
Wir geben einen Überblick über die Microsoft Cloud, stellen für Administratoren, Entwickler und IT-Managerdie neuesten Produkte und Technologien vor und zeigen Ihnen, wie Sie Cloud Services in Ihre bestehende Infrastruktur integrieren und Ihre Software an die Cloud anpassen bzw. in der Cloud bereitstellen können.

Für IT-Professionals und Administratoren dürften besonders die Vorträge "Windows InTune" (Ralf Schnell), "Office 365 für Administratoren" (Steffen Krause, Daniel Melanchthon) oder "Private Cloud
selber aufbauen" (Frank Koch) interessant sein.
Relevant für Entwickler sind u.a. Vorträge zur "Migration von Anwendungen in die Cloud" (Dariusz Parys), zur "Entwicklung von SaaS Lösungen auf Basis der Windows Azure Platform" (Patric Boscolo) und zu dem "Betrieb und Entwicklung mit der Microsoft Cloud" (Holger Sirtl).


This posting is provided "AS IS" with no warranties, and confers no rights.

Microsoft TechSummit Cloud – die Roadshow für Developer & IT Professionals

16.03.2011 09:27:29 | Jens Häupel

“CLOUD Computing” ist wohl das Buzzword des Jahres. Aber was steckt wirklich dahinter? Macht das Sinn für mich? Welche Dienste gibt es? Was ist der Unterschied zwischen SaaS, PaaS, IaaS und was hat es mit Public und Private Cloud auf sich? Ist das Ganze eigentlich sicher? Muss ich als Entwickler oder Administrator alles neu lernen? Und was hat Microsoft eigentlich mit Cloud zu tun?

Antworten hierzu gibt es auf unserer Roadshow Microsoft TechSummit Cloud.

Vom 28. März bis zum 8. April 2011 touren Experten von Microsoft TechNet und MSDN durch sechs deutsche Metropolen um Best Practices und technische Hintergründe zu den neuesten Microsoft Cloud-Technologien zu vermitteln und Anwenderfragen zu beantworten.
Wir geben einen Überblick über die Microsoft Cloud, stellen für Administratoren, Entwickler und IT-Manager die neuesten Produkte und Technologien vor und zeigen Ihnen, wie Sie Cloud Services in Ihre bestehende Infrastruktur integrieren und Ihre Software an die Cloud anpassen bzw. in der Cloud bereitstellen können.

Für IT-Professionals und Administratoren dürften besonders die Vorträge "Windows InTune" (Ralf Schnell), "Office 365 für Administratoren" (Steffen Krause, Daniel Melanchthon) oder "Private Cloud selber aufbauen" (Frank Koch) interessant sein.
Relevant für Entwickler sind u.a. Vorträge zur "Migration von Anwendungen in die Cloud" (
Dariusz Parys), zur "Entwicklung von SaaS Lösungen auf Basis der Windows Azure Platform" (Patric Boscolo) und zu dem "Betrieb und Entwicklung mit der Microsoft Cloud" (Holger Sirtl).

WPF4 und Silverlight 4 gegen Krebs!

16.03.2011 07:55:05 | Peter Nowak

Leider ist es nicht möglich mit WPF und Silverlight Krebs zu heilen – man kann damit jedoch helfen.

Aus diesem Grund startet unser geschätzter Kollege Gregor Biswanger a, 16.03.2011 ab 19 Uhr eine Auktion der WPF 4 und Silverlight 4 Trainings von video2brain. Damit noch nicht genug – das Paket enthält jede Menge Unterschriften internationaler Developer-Rockstars.

Coole Aktion, wie wir finden. Mehr Informationen gibt es zur Aktion hier!



This posting is provided "AS IS" with no warranties, and confers no rights.

Heiter bis wolkig: Microsoft TechSummit Cloud – die Roadshow für Entwickler & IT Professionals

15.03.2011 17:21:42 | Oliver Scheer

Registrierung & Informationen unter www.tech-summit.de Vom 28. März bis zum 8. April touren die Experten des Microsoft Developer Network und TechNet Deutschland durch sechs deutsche Metropolen, um im Rahmen der Microsoft-Roadshow "TechSummit Cloud" Best Practices und technische Hintergründe zu den neuesten Microsoft Cloud-Technologien zu vermitteln und Anwenderfragen zu beantworten. Es wird ein umfassender Überblick für Entwickler, Administratoren und IT-Manager über das komplette Cloud-Angebot von Microsoft gegeben und gezeigt, wie diese Cloud Services in bestehende Infrastrukturen integriert werden können sowie Software an die Cloud angepasst und in der Cloud bereitgestellt werden kann. Für Entwickler interessant sind bei den Ganztages-Veranstaltungen u.a. Vorträge zur "Migration von Anwendungen in die Cloud" (Dariusz Parys), zur "Entwicklung von SaaS Lösungen auf Basis der Windows Azure Platform" (Patric Boscolo) und zu "Betrieb und Entwicklung mit der Microsoft Cloud" (Holger Sirtl). Für IT-Professionals und Administratoren dürften die Vorträge "Windows InTune" (Ralf Schnell), "Office 365 für Administratoren" (Steffen Krause, Daniel Melanchthon) oder "Private Cloud selber aufbauen" (Frank Koch) mehr als interessant sein. Ein Blick in die tagesaktuelle Agenda verrät zudem, welche Themen in der Keynote und Closing Session vermittelt werden. Station macht die Roadshow in München (28.03.), Karlsruhe (30.03.), Frankfurt/M. (01.04.), Köln (04.04.), Hamburg (06.04.) und Dresden (08.04). Die Teilnahme kostet 79 Euro zzgl. MwSt.: Die Teilnahmegebühr umfasst den Zutritt zur Veranstaltung, die Verpflegung sowie unsere Specials, die Sie vor Ort erhalten (u.a. USB-Stick mit Präsentationen und dem Buch: Cloud Computing mit Windows Azure Platform; TechNet/MSDN Webcast DVD Jahresedition 2010; DVD zum Thema Virtualisierung). Weitere Events für Entwickler unter www.msdn-online.de/events Weitere Events für Entwickler unter http://www.microsoft.com/germany/technet/events/default.mspx...(read more)

WPF 4 und Silverlight 4 gegen Krebs!

15.03.2011 10:52:00 | Gregor Biswanger

(See English version below)


Leider gibt es keine Anwendung in WPF 4 und Silverlight 4, die diese Krankheit heilen könnte. Allerdings können wir mit finanziellen Mitteln helfen den Krebs zu bekämpfen. Deshalb starte ich eine Auktion auf eBay und versteigere die neue DVD „WPF 4 und Silverlight 4“. Bei dieser DVD handelt es sich nicht um die gewöhnliche Kaufversion, sondern um ein exklusives Stück. Die DVD wurde vom WPF-, Silverlight- und Expression Blend-Produktteam für diesen guten Zweck signiert. Der Erlös geht direkt an die Deutsche Krebshilfe e.V.

WPF 4 und Silverlight 4 - special edition

 

Warum gerade die Deutsche Krebshilfe e.V.?

Bei einem 16-jährigen Jungen aus meinem Verwandtenkreis wurde Leukämie diagnostiziert. Zuerst brach für uns die Welt zusammen. So eine Krankheit in so jungem Alter. In dieser Situation war die Deutsche Krebshilfe e.V. mit vollstem Einsatz eine perfekte Stütze. In so einem Fall ist man auf eine solche Organisation wirklich angewiesen, um die nächsten Schritte im Leben finden zu können. An dieser Stelle auch noch mal ein Dankeschön für den großen Einsatz der Deutschen Krebshilfe.

DKH_Logo

 

 

Was genau ist die Deutsche Krebshilfe e.V.?

Die Deutsche Krebshilfe e. V. setzt sich seit über 36 Jahren für krebskranke Menschen ein. Gegründet wurde die gemeinnützige Organisation am 25. September 1974. Ihr Ziel ist es, die Krebskrankheiten in all ihren Erscheinungsformen zu bekämpfen.

Jedes Jahr erkranken in Deutschland 450.000 Menschen neu an Krebs, davon 1.800 Kinder und Jugendliche unter 15 Jahren. Den Betroffenen und ihren Angehörigen zu helfen, ist das wichtigste Anliegen der Deutschen Krebshilfe.

Die Deutsche Krebshilfe e.V. finanziert ihre Aktivitäten ausschließlich aus freiwilligen Zuwendungen der Bevölkerung. Sie erhält keine öffentlichen Mittel.

Weitere Informationen zur Deutschen Krebshilfe e.V. unter: http://www.krebshilfe.de

 

Feste Unterstützung

Damit sicher schon mal etwas zusammen kommt haben folgende Personen sich entschlossen unabhängig der Auktion einen festen Betrag zu Spenden:

Dr. Holger Schwichtenberg  (.NET-Dozent und -Berater bei www.IT-Visions.de)                                 250 €
Microsoft Press Team   http://www.microsoft-press.de                                                                         200 €
Michael Ferschl             (Geschäftsführer von impuls Informationsmanagement GmbH)                     200 €
Microsoft Deutschland GmbH  (Developer Platform & Strategy Group )                                              100 €
Microsoft Deutschland GmbH  (Community Leader/Insider Program (CLIP))                                      100 €
Microsoft Deutschland GmbH   (MVP Awards Program)                                                                      100 €
.NET Day Franken         (http://www.dotnet-day-franken.de)                                                                100 €
Ruben Bonzanin            (http://www.techniker-support.de)                                                                   100 €
Ralf Schoch                    (CoDeSo)                                                                                                    77,77 €
Andreas Weizel              (http://www.awzhome.de)                                                                                70 €
Roland Schumacher    (http://www.EdelsteinKreationen.ch)                                                             66,66 €
Nico Franze                    (http://www.nfranze.de)                                                                                   60 €
Florian Seffert                (Flory IM | Your Windows Phone 7 Messenger)                                              50 €
Robert Walter                 (Softwareentwickler bei conplement AG)                                                        50 €
Mathias Schiffer                                                                                                                                         50 €
Enrico Gebauer             (http://silverlight-essentials.com/blog/)                                                             50 €
Peggy Reuter                 (http://peggy-reuter.net)                                                                                   50 € 
Gregor Biswanger        (Solution Architect bei impuls Informationsmanagement GmbH)                      50 €
Sebastian Geertsen     (Graf GmbH & Co. KG Ingolstadt)                                                                     50 € 
(Anonym)                                                                                                                                                   50 €

Vielen lieben Dank für die Unterstützung an alle festen Spender!

Zur Auktion

Wer also etwas ganz besonderes Zuhause haben möchte und dabei etwas Gutes tun will, sollte gleich mitbieten unter: eBay - WPF 4 & Silverlight 4 DVD - Special Edition

Ich freue mich, wenn die Community diese Aktion unterstützt. Bedenkt bitte, dass diese Krankheit jeden von uns oder jemanden in unserer Familie treffen kann und wir dank der Deutschen Krebshilfe eine Stütze und eine Motivation zum Weiterleben bekommen.

Nochmal vielen lieben Dank an die Produktteams bei Microsoft für ihre großartige Unterstützung:

Scott Hanselman   (Principal Program Manager Lead in Server and Tools Online)
Tim Heuer               (Program Manager for Microsoft Silverlight)
Rob Relyea             (Principal Program Manager Lead - Client Platform WPF & Silverlight)
Pete Brown              (Developer Division Community Program Manager - Windows Client)
Eric Fabricant          (Program Manager WPF)
Jeff Wilcox                (Silverlight Senior SDE)
Jeffrey R Ferman    (SDET Visual Studio Client Dev Tools)
Chan Verbeck         (Expression Blend Team)
Yaniv Feinberg        (Expression Blend Team)
Douglas Olson       (Director Dev Expression)
Samuel W. Bent     (Principal Software Design Engineer WPF)
John Papa               (Technical Evangelist for Silverlight)

WP_000456WP_000470WP_000474

WP_000477WP_000480WP_000515

--------------------------------------------------------------------------------------------------------

WPF 4 and Silverlight 4 against cancer

Unfortunately, there is no application in WPF 4 and Silverlight 4, to cure this disease. However, we can help defending cancer with financial means. Therefore I would like to start an auction on eBay and sell the new DVD "WPF 4 and Silverlight 4". This DVD is not about the ordinary version you can buy, but an exclusive piece. The DVD was signed by the WPF, Silverlight and Expression Blend product-team for this good cause. The proceeds go directly to the German Cancer Aid.

Why supporting the German Cancer Aid?

A 16 year old boy of my relatives was diagnosed with leukemia. First, the world collapsed. Such a bad disease at that young age. In this situation, the German Cancer aid association was a perfect support with strongest commitment. To find the next steps in life in this case really depends on such an organization. Again at this point a heardly thank you for the strong commitment of this organization.

Who is the German Cancer Aid?

For over 36 years the German Cancer Aid e. V. is committed to fight all manifestations of cancer. The non-profit organization was founded on the 25th of September 1974. Its ambition is to combat the cancer diseases in all their forms.

In Germany 450,000 people newly come down with cancer every year, including 1,800 children and young people under the age of 15. The most important concern of the German Cancer Aid is to help affected persons and their families.

The German Cancer Aid association is financing her activities exclusively from voluntary contributions of the population. It‘s receiving no public funding.

Learn more about the German Cancer aid association at: http://www.krebshilfe.de/english.html

 

Solid support

Make sure ever something along the following persons have decided the auction regardless a fixed amount to donate:

Dr. Holger Schwichtenberg     (.NET-Dozent und -Berater bei www.IT-Visions.de)                                  250 €
Microsoft Press Team       http://www.microsoft-press.de                                                                          200 €
Michael Ferschl                  (Managing Director by impuls Informationsmanagement GmbH)                   200 €
Microsoft Deutschland GmbH   (Developer Platform & Strategy Group )                                                  100 €
Microsoft Deutschland GmbH   (Community Leader/Insider Program (CLIP))                                          100 €
Microsoft Deutschland GmbH   (MVP Awards Program)                                                                           100 €
.NET Day Franken             (http://www.dotnet-day-franken.de)                                                                 100 €
Ruben Bonzanin                (http://www.techniker-support.de)                                                                   100 €
Ralf Schoch                        (CoDeSo)                                                                                                     77,77 €
Andreas Weizel                  (http://www.awzhome.de)                                                                                 70 €
Roland Schumacher         (http://www.EdelsteinKreationen.ch)                                                             66,66 €
Nico Franze                         (http://www.nfranze.de )                                                                                  60 €
Florian Seffert                     (Flory IM | Your Windows Phone 7 Messenger)                                              50 €
Robert Walter                     (Developer by conplement AG)                                                                        50 €
Mathias Schiffer                                                                                                                                              50 € 
Enrico Gebauer                 (http://silverlight-essentials.com/blog/)                                                              50 €
Peggy Reuter                     (http://peggy-reuter.net)                                                                                    50 €
Gregor Biswanger            (Solution Architect at impuls Informationsmanagement GmbH)                        50 €
Sebastian Geertsen         (Graf GmbH & Co. KG Ingolstadt)                                                                      50 €
(Anonym)                                                                                                                                                        50 €

Best thanks for the support to all solid donators!

 

About the auction

So, if you would like to have something very special at home and also want to do something good, immediately go bidding at:

eBay - WPF 4 & Silverlight 4 DVD - Special Edition

I’am happy if the community supports this action. Please consider that this disease can affect all of us or members of our families and we‘ll get support and motivation to continue our life. Thanks to the German Cancer Aid.

Thanks again to the product teams at Microsoft for their great support:

Scott Hanselman   (Principal Program Manager Lead in Server and Tools Online)
Tim Heuer               (Program Manager for Microsoft Silverlight)
Rob Relyea             (Principal Program Manager Lead - Client Platform WPF & Silverlight)
Pete Brown              (Developer Division Community Program Manager - Windows Client)
Eric Fabricant          (Program Manager WPF)
Jeff Wilcox                (Silverlight Senior SDE)
Jeffrey R Ferman    (SDET Visual Studio Client Dev Tools)
Chan Verbeck         (Expression Blend Team)
Yaniv Feinberg        (Expression Blend Team)
Douglas Olson       (Director Dev Expression)
Samuel W. Bent     (Principal Software Design Engineer WPF)
John Papa               (Technical Evangelist for Silverlight)

Mein Blog auf SQLServerBlogs.de

15.03.2011 09:24:00 | Martin Hey

Ende letzten Jahres hatte Constantin die Idee, dass auch für die deutschsprachige SQL Server Community eine Plattform ähnlich den DotNetGermanBloggers gut und sinnvoll wäre. Und diese Idee unterstütze ich.

Dank der Verwendung von von O/R-Mappern verschwindet der direkte Datenbankzugriff inzwischen mehr und mehr in der klassischen .NET-Entwicklung. Trotzdem gibt es auch immer wieder Fälle, in denen das Was-passiert-da-eigentlich oder das Warum-geht-das-jetzt-nicht Probleme bereitet. Und genau dann ist es gut, wenn man auch im deutschsprachigen Raum Hilfe findet.

Deshalb: Ab sofort finden sich meine Blogposts zum Thema SQL Server auch auf SQLServerBlogs.de.

Reports und SharePoint Dokumente für ein TFS Portal nachträglich einspielen

15.03.2011 02:47:51 | Thomas Schissler

Es gibt verschiedene Situationen in denen man nachträglich Reports oder SharePoint Dokumente nachträglich für ein bestehendes Team Project einrichten möchte, z.B. nach einer Migration von einer älteren TFS Version oder wenn das Projekt ohne Reports oder SharePoint Portal angelegt wurde. Dafür gibt es bei den Team Foundation Server Power Tools die Befehle

  • tfpt addprojectportal   Add or move portal for an existing team project
  • tfpt addprojectreports  Add or overwrite reports for an existing team project

Mit dieser Methode hatte ich aber bereits mehrfach Probleme und die Einstellungen sind auch nicht so feingranular möglich. Deshalb möchte ich hier eine andere Methode beschreiben. Hierzu legt man zunächst eine XML-Datei an. Für die SharePoint-Dokumente sieht die XML-Datei folgendermaßen aus:

<?xml version="1.0" encoding="utf-8"?>

<Project xmlns="ProjectCreationSettingsFileSchema.xsd">
<TFSName>http://vs2010:8080/tfs/sandbox</TFSName>
<LogFolder>c:\Temp\</LogFolder>
<ProjectName>VS2010_Demos</ProjectName>
<AddFeaturesToExistingProject>true</AddFeaturesToExistingProject>
<ProjectSiteEnabled>true</ProjectSiteEnabled>
<ProjectSiteWebApplication>VS2010</ProjectSiteWebApplication>
<ProjectSitePath>/sites/sandbox/vs2010_demos/</ProjectSitePath>
<ProjectSiteTitle>VS2010 Demos</ProjectSiteTitle>
<ProjectSiteDescription>Demo</ProjectSiteDescription>
<ProcessTemplateName>MSF for Agile Software Development v5.0</ProcessTemplateName>
</Project>
 
Für die Reports hat die Datei folgenden Aufbau:
 
<?xml version="1.0" encoding="utf-8"?>

<Project xmlns="ProjectCreationSettingsFileSchema.xsd">
<TFSName>http://vs2010:8080/tfs/sandbox</TFSName>
<LogFolder>c:\temp</LogFolder>
<ProjectName>VS2010_Demos</ProjectName>
<AddFeaturesToExistingProject>true</AddFeaturesToExistingProject>
<ProjectReportsEnabled>true</ProjectReportsEnabled>
<ProjectReportsForceUpload>true</ProjectReportsForceUpload>
<ProjectSiteEnabled>false</ProjectSiteEnabled>
<ProcessTemplateName>MSF for Agile Software Development v5.0</ProcessTemplateName>
</Project>


Die Parameter sollten weitgehend selbsterklärend sein, eine weitere Beschreibung finden sich hier. Diese XML-Dateien können nun ausgeführt werden indem im Command-Window innerhalb von Visual Studio der Befehl

File.BatchNewTeamProject <XML-Datei>

Der Import wird damit angestoßen. Zu beachten ist, dass der Vorgang eine Weile dauern kann. Den Erfolg des Imports kann man in der Log-Datei im angegebenen Ordner überprüfen.

Verwaiste Logins in SQL-Server-Datenbanken neu zuordnen

14.03.2011 15:56:00 | Martin Hey

In meinen Blogpost Verwaiste SQL-Logins auf einem SQL-Server ermitteln hab ich gezeigt, wie man mit Hilfe eines Skriptes ermitteln kann, welchen Logins gar keine Datenbanken mehr zugewiesen sind.

Aber das Thema der verwaisten Logins gibt es auch in umgekehrter Richtung: Jeder der bereits versucht hat, eine Datenbank von einem anderen Server wiederherzustellen und diese Datenbank verfügte über SQL-Benutzer, wird das Problem kennen: In der Datenbank gibt es unter dem Punkt Datenbank -> Security -> Users bereits mehrere Benutzer und diese sind unter Umständen auch mit Berechtigungen versehen, man möchte diese also nicht löschen. Die Benutzer existieren jedoch nicht als Logins unter Security -> Logins. Legt man dann gleichnamige Logins im SQL-Server an, so ist das auch noch recht unproblematisch - zumindest so lange bis man versucht, den neu angelegten Login auf der besagten Datenbank zuzulassen. Diesen Versuch quittiert der SQL-Server mit der Meldung, dass ein Benutzer mit diesem Namen in der Datenbank schon vorhanden ist - womit er ja grundsätzlich auch Recht hat.
Create failed for user 'SQLAdmin'. User, group or role 'SQLAdmin' already exists in the current database. (Microsoft SQL Server, Error 15023)

Allerdings bedeutet das nicht, dass das eben neu angelegte Login aufgrund dieser Tatsache auch automatisch mit Zugriffsrechten auf der wiederhergestellten Datenbank ausgestattet ist.
Die Ursache liegt darin begründet, dass der SQL-Server den Benutzern intern eine SID zuweist. Die SID des Benutzers in der wiederhergestellten Datenbank und die SID des eben erstellten Logins unterscheiden sich.

Abhilfe schafft hier die Systemprozedur sp_change_users_login. Mit dem Parameter 'report' aufgerufen erhält man zunächst eine Auflistung aller Benutzer, die über keine Zuordnung zu Logins verfügen.
exec sp_change_users_login 'report'

Nun steht also fest, dass es in der Datenbank fünf ungemappte Benutzer gibt. Mit Hilfe der gleichen Prozedur kann man nun auch gleich das Mapping vornehmen. Dazu übergibt man einfach als ersten Parameter 'update_one' und als zweiten bzw. dritten Parameter Benutzer und Login.
EXEC sp_change_users_login 'update_one', 'SQLAdmin', 'SQLAdmin'

Prüft man nun die verwaisten Logins erneut, wird man feststellen, dass dieser Benutzer hier nicht mehr erscheint und versucht man ein Login auf der Datenbank, wird man merken, dass das nun funktioniert.

Der Performance Wizard für Silverlight

14.03.2011 14:48:25 | Gregor Biswanger

Das kürzlich veröffentlichte Visual Studio 2010 Service Pack 1 erweiterte den Visual Studio Performance Wizard um die Unterstützung von Silverlight Anwendungen. Womit nun ein professionales Profiling von Silverlight Anwendung durchgeführt werden kann. Leider ist allerdings der Performance Wizard nur in den Visual Studio Versionen Premium und Ultimate verfügbar.

 

Profiling Beispiel

Als Beispiel wird ein neues Silverlight-Projekt mit dem Namen „SilverlightPerformanceWizard“ angelegt. In die Mitte der Oberfläche (MainPage.xaml) wird ein Button mit dem Text „Process start“ gesetzt.

 

SNAGHTML3e9bb3

Abbildung 1 – Oberfläche der Silverlight-Beispielanwendung.

 

Anschließend wird mittels Doppelklick auf den Button das Click-Event Abonniert, worin der Source-Code aus Listing 1 folgt.

 

 

   1:  private void Button_Click(object sender, RoutedEventArgs e)
   2:  {
   3:    const string text = "test";
   4:   
   5:    for (int i = 0; i < 10000000; i++)
   6:    {
   7:      string value = text.Replace('t', 'b');
   8:    }
   9:  }

Listing 1 – Source-Code zur Performance-Messung.

 

 

Nun ist die Beispielanwendung einsatzbereit. Der Performance Wizard wird unter dem Menüpunkt „Analyze“ – „Launch Performance Wizard…“ gestartet.

 

 

image

Abbildung 2 – Performance Wizard starten.

 

Der Wizard bietet nun unterschiedliche Profiling Möglichkeiten an. Dabei kann die CPU, Speicher, Threads und vieles weitere analysiert werden. Bei diesem Beispiel wird normal der CPU verbrauch analysiert, wobei der erste Punkt ausgewählt bleibt.

 

 

SNAGHTML40a0b2

Abbildung 3 – Auswahl eines Profiling-Profils beim Performance Wizard.

Beim nächsten Schritt muss die Silverlight-Anwendung ausgewählt werden. Das wäre bei diesem Beispiel der erste Punkt mit „SilverlightPerformanceWizard“. Der zweite Punkt wäre nur das Web-Projekt das die eigentliche Silverlight-Anwendung hostet.

 

 

SNAGHTML40e89a

Abbildung 4 – Silverlight-Anwendung auswählen.

Der letzte Schritt bietet lediglich das sofortige ausführen des Profiling an. Das bei diesem Beispiel auch geschehen soll.

 

 

SNAGHTML41363d

Abbildung 5 – Das Profiling soll anschließend gestartet werden.

 

Jetzt öffnet sich die Silverlight-Anwendung wobei einmal auf den Button geklickt wird. Zum Test kann gerne nach 1-2 Sekunden Pause wiederholt auf den Button geklickt werden. Nun wird die Silverlight-Anwendung durch schließen des Browsers wieder beendet. Das Profiling von Visual Studio analysiert nun die aufgezeichneten Daten und stellt sofort Visualisiert den gesamten Prozessablauf dar.

 

 

SNAGHTML417e63

Abbildung 6 – Der Profiling Report von Visual Studio.

In der Mitte des Reports bei „Hot Path“ wird sofort ersichtlich das von der gesamt Laufzeit die Methode System.String.Replace(char, char) bis zu 88% CPU last verbrauchte. Die Visualisierte Darstellung zu Beginn des Reports kann auch nochmal auseinandergenommen werden um weitere Details aufzuspüren.

 

Zum Beispiel ist ersichtlich dass die Kurve bei 3 – 5 Sekunden und bei 7 – 9 Sekunden aufschlägt. Hier kann jetzt mittels Klick auf 3 bis 5 der Bereich markeiert werden. Anschließend klickt man rechts daneben auf „Filter by selection“.

 

image

Abbildung 7 – Speziellen Bereich analysieren.

Nach dem aktualisieren des Reports, wird sofort bei „Functions Doing Most Individual Work“ ersichtlich das in diesem Bereich 91,44 % die CPU von der Methode System.String.Replace(char, char) beansprucht hat. Somit wird klar, dass genau an dieser Stelle der Kurve der Button geklickt wurde.

 

image

Abbildung 8 – Der Report im Detail.

Fazit

Das Profiling ist sehr angenehm und hat sich bei einigen Tests positiv ausgewirkt. Sehr angenehm ist auch der Performance Explorer (Menü: „View“ – „Other Windows“ – „Performance Explorer“), womit jederzeit bereits erstellte Profiling-Wizard-Einstellungen direkt ausgeführt werden können und bisherige Profiling Reports hinterlegt sind. Sollten Features vermisst werden und ein noch umfangreiches Profiling ermöglicht werden, kann ich auch den kostenpflichtigen ANTS Profiler von Redgate empfehlen.

Neue WebCasts zum Open XML SDK 2.0

14.03.2011 14:30:38 | Jens Häupel

Im Februar habe ich mir mal die Zeit genommen, ein paar der Beispiele und Ideen aus meinem Blog in Video-Tutorial umzusetzen. Herausgekommen sind diese 4 WebCasts:

Dateimanipulation mit den Open XML SDK 2.0-Excel-Dateien (Teil 1 von 4) - Benannte Bereiche in Excel: Anlegen und Auslesen von Named Ranges

Dateimanipulation mit den Open XML SDK 2.0-Excel-Dateien (Teil 2 von 4) - Excel-Dateien erzeugen, Zellen und Zeilen in Excel-Tabellen anlegen und einfügen

Dateimanipulation mit den Open XML SDK 2.0-Excel-Dateien (Teil 3 von 4) - Die Handhabung von Shared Strings

Dateimanipulation mit den Open XML SDK 2.0-Excel-Dateien (Teil 4 von 4) - Formatvorlagen für Excel: Der Umgang mit StyleSheets

Visual Studio SP1, Team Foundation Server SP1 und weitere Ankündigungen

14.03.2011 10:23:14 | Thomas Schissler

Inzwischen hat es sich sicher herumgesprochen, dass das SP1 für Visual Studio und den TFS verfügbar ist. Allerdings bekomme ich einige Fragen zu Installation, was muss wo installiert werden. Deshalb möchte ich hier auf einen Blog Post von Brian Harry verweisen der die Details beschreibt.

Und dann möchte ich noch auf einen Punkt aufmerksam machen der vielleicht etwas untergegangen ist. Ab sofort steht den Besitzer einer Visual Studio 2010 Ultimate mit MSDN Subscription der Load Test Virtual User Pack für eine unbegrenzte Anzahl virtueller User zur Verfügung. Damit sind nun Load Tests ohne zusätzliche Lizenzkosten möglich. Und Load Tests sind nicht nur für Stress Tests sinnvoll sondern können auch Concurrency-Probleme aufdecken und eignen sich auch sehr gut um Performance-Tests auch für kleinere Anwendungen. Weitere Infos zur Lizenzänderung gibt es hier: http://www.microsoft.com/visualstudio/en-us/products/2010-editions/load-test-virtual-user-pack

Den HTML-Header in BlogEngine.NET optimieren

13.03.2011 18:36:08 | Klaus Bock

BlogEngine.NET

… und warum sollte ich das tun?
Weil die Reihenfolge der Tags im Header Einfluss auf das Ladeverhalten der Browser nimmt. Das Zauberwort hierbei ist: Progressive Page Rendering. Damit ist jenes Verhalten des Browsers gemeint, in dem er jeglichen Inhalt der vom Server übertragen wird unmittelbar rendert und darstellt.
Sollten sich im Header an erster Stelle Verknüpfungen zu JavaScript-Dateien befinden, wird die Verarbeitung solange gestoppt bis alle verknüpften JavaScript-Dateien heruntergeladen wurden. Erst dann werden weitere Ressourcen vom Server geladen. Wenn zu diesem Zeitpunkt noch keine Styling-Informationen bzw. kein CSS vorhanden ist, sitzt der Benutzer solange vor einem weißen Fenster, bis der Download der JavaScript-Dateien abgeschlossen ist. Demzufolge sollten die Verknüpfungen zu den CSS-Dateien an erster Stelle im Header platziert werden. Hierzu auch ein guter Artikel zu Performance and Load Testing in der MSDN Darin sind zwar die Bing Maps das vorherrschende Thema, aber durchaus auch sehr viele allgemeingültige Infos und Tipps enthalten.

Eine weitere Unart von BlogEngine.NET, seit der Version 2.0, ist das Laden der jQuery-Dateien in jedem Artikel und jeder Seite. Egal ob sie benötigt werden oder nicht. Ich für meinen Teil benötige jQuery nicht im normalen Betrieb. Lediglich im Admin-Bereich, zur Verwaltung des Blog, wird es benötigt. Also warum immer diese Last mitschleppen?
Soweit zur Theorie. Werfen wir nun einen Blick auf einen möglichen Lösungsansatz.

Der gesamte Header soll vor dem Senden zum Client untersucht, evtl. überflüssige Einträge entfernt und neu sortiert werden.
Dem Header werden in BlogEngine.NET an verschiedenen Stellen Elemente hinzugefügt. Unter anderem in der MasterPage des verwendeten Theme und im OnLoad-Ereignishandler der BlogBasePage. Somit wäre der am einfachsten zu erreichende, aber doch späteste mögliche Zeitpunkt um den Header mit allen Elementen zu verarbeiten, der PageLoad-Ereignishandler der Masterpage des verwendeten Theme. Der Aufruf sollte in besagtem Ereignishandler so spät als möglich, aber doch so früh erfolgen, dass er immer ausgeführt wird. Also noch vor evtl. bedingten Ausstiegen aus dem Ereignishandler.

Die Elemente im Header werden in Form verschiedener Controls in einer ControlCollection vorgehalten. Am häufigsten sind Controls der Typen HtmlGenericControl, HtmlLink und HtmlMeta anzutreffen. Für das title-Tag wird ein Steuerelement vom Typ HtmlTitle verwendet. Um die verschiedenen Einträge im Header zu Kategorisieren verwende ich fünf verschiedene Auflistungen vom Typ List<T>, wobei T vom Typ System.Web.UI.Control ist.

  1. cssTags für das Speichern der im Header enthaltenen Verknüpfungen zu CSS-Dateien.
  2. scriptTags für die Verknüpfungen zu JavaScript-Dateien.
  3. linkTags für andere benötigte Verknüpfungen
  4. otherTags für nicht zugeordnete Einträge
  5. metaTags für alle Einträge vom Typ HtmlMeta.

In folgender Methode wird der angegebene Header durchlaufen, die enthaltenen Elemente Kategorisiert, der vorhandene Header geleert und sortiert neu erstellt.

public static void OptimizeHeader(HtmlHead header, bool removeJQuery)
{
    var firstTag = header.Controls[0];

    if (firstTag is HtmlLink
        && ((HtmlLink)firstTag).Attributes["rel"].Equals(
            "stylesheet",
            StringComparison.OrdinalIgnoreCase))
    {
        return;
    }

    var title = new HtmlTitle();
    var cssTags = new List<Control>();
    var scriptTags = new List<Control>();
    var linkTags = new List<Control>();
    var metaTags = new List<Control>();
    var otherTags = new List<Control>();
    var allControls = new List<Control>[]
    {
        cssTags,
        scriptTags,
        linkTags,
        otherTags,
        metaTags
    };

    foreach (Control control in header.Controls)
    {
        switch (control.GetType().Name)
        {
            case "HtmlLink":
                ProcessHtmlLink(
					(HtmlLink)control,
					allControls);
                break;

            case "HtmlMeta":
                metaTags.Add(control);
                break;

            case "HtmlGenericControl":
                ProcessGenericControl(
					(HtmlGenericControl)control,
					allControls,
					removeJQuery);
                break;

            case "HtmlTitle":
                title = (HtmlTitle)control;
                break;

            default:
                otherTags.Add(control);
                break;
        }
    }

    header.Controls.Clear();

    foreach (var entry in allControls.AsQueryable()
			.SelectMany(list => list.AsQueryable()))
    {
        header.Controls.Add(entry);
    }

    header.Controls.Add(title);
}

Zunächst wird geprüft ob der angegebene Header bereits sortiert ist in dem überprüft wird, ob das erste Element im Header eine Verknüpfung zu einer CSS-Datei darstellt. Ist diese Bedingung erfüllt, wird die Methode beendet.
Die in den Zeilen 168 und 178 verwendeten Hilfsmethoden ProcessHtmlLink und ProcessGenericControl werden zur Verarbeitung der entsprechenden Steuerelemente benötigt.

private static void ProcessGenericControl(
					HtmlGenericControl htmlControl,
					List<Control>[] allControls,
					bool removeJQuery)
{
    if (htmlControl.TagName.Equals("script", StringComparison.OrdinalIgnoreCase))
    {
        if (removeJQuery
            && IsJQueryLink(htmlControl))
        {
            return;
        }

        allControls[1].Add(htmlControl);
        return;
    }

    allControls[3].Add(htmlControl);
}

private static void ProcessHtmlLink(HtmlLink link, List<Control>[] allControls)
{
    switch (link.Attributes["rel"])
    {
        case "stylesheet":
            allControls[0].Add(link);
            break;

        case "profile":
            allControls[1].Add(link);
            break;

        default:
            allControls[2].Add(link);
            break;
    }
}

Eine weitere Hilfsmethode IsJQueryLink überprüft lediglich, ob es sich beim angegebenen Steuerelement um eine Verknüpfung zu einer der jQuery-Dateien handelt.

private static bool IsJQueryLink(HtmlGenericControl control)
{
    var src = control.Attributes["src"];

    return src.EndsWith("jquery.js", StringComparison.OrdinalIgnoreCase)
        || src.EndsWith("jquery.cookie.js", StringComparison.OrdinalIgnoreCase)
        || src.EndsWith("jquery.validate.min.js", StringComparison.OrdinalIgnoreCase)
        || src.EndsWith("jquery-jtemplates.js", StringComparison.OrdinalIgnoreCase)
        || src.EndsWith("json2.js", StringComparison.OrdinalIgnoreCase);
}

Fazit:

Welchen Vorteil bringt mir der erbrachte Aufwand?
Die geschilderte Methode allein bringt mit Sicherheit keinen enormen Vorteil. In Verbindung mit weiteren kleineren und größeren Optimierungen und Anpassungen, sollte es jedoch ein Schritt in die richtige Richtung sein.

Technorati-Tags: | |

Remote Desktop Connection Manager

13.03.2011 12:02:00 | Martin Hey

Wer oft mit vielen Remote-Desktop-Verbindungen arbeitet kennt das Problem: Für jede Verbindung wird eine eigene *.rdp-Datei angelegt und diese Dateien schwirren dann irgendwo auf dem System herum. Nun bin ich letzte Woche dank eines Tipps über ein sehr nützliches Tool gestolpert, das es seit etwa 10 Monaten gibt und das auch schon öfter in diversen Blogs vorgestellt wurde (z.B. auch im Code-Inside Blog) - der Remote Desktop Connection Manager.

Hier lassen sich mehrere Remote Desktop Connections zu Gruppen zusammenfassen. Diesen Gruppen kann man gemeinsame Einstellungen verpassen, so dass beispielsweise alle Verbindungen der gleichen Gruppe mit identischen Credentials geöffnet werden, die man dann nur in den Gruppeneigenschaften pflegen muss. Diese Vererbung beschränkt sich aber nicht nur auf Credentials, sondern auch auf andere Eigenschaften wie Bildschirmauflösung, Audioeinstellungen usw. Natürlich lassen sich die Einstellungen auch pro Verbindung einzeln konfigurieren.

Im Gegensatz zu den *.rdp-Dateien können hier innerhalb der Datenstruktur auch Credentials gespeichert werden, was ebenfalls ein Vorteil ist. Die Import-Schnittstelle aus Textdateien ist inzwischen als deprecated gekennzeichnet, aber *.rdg-Dateien sind relativ selbsterklärende XML-Strukturen. Ist das Kennwort verschlüsselt abgelegt, so lässt es sich auf einem anderen Rechner nicht entschlüsseln, was aber aus meiner Sicht auch nicht weiter schlimm ist. Wenn man dieses Tool wirklich braucht, so ist man vermutlich häufig mit Admin-Rechten auf irgendwelchen Rechnern unterwegs und dann wäre es fatal, wenn man durch einfaches Kopieren der *.rdg-Datei die vollen Berechtigungen hätte, ohne Kenntnis vom Kennwort zu haben. Wie es aussieht, kann man das umgehen, indem man das Kennwort im Klartext speichert und dann sollte es problemlos möglich sein, eine *.rdg-Datei auch an Kollegen zu geben.

Internet Explorer 9 RTW

13.03.2011 10:30:39 | Damir Tomicic

Mozilla Foundation und Google legten vor und nun schreitet auch Microsoft im Browser-Rennen voran - die neuste Version 9 von Internet Explorer wird nun in einer finalen Version zum Download bereitgestellt. Unter den 39 Sprachen ist Deutsch natürlich auch dabei:

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

Die interessanteste Neuerung betrifft die Hardware-Beschleunigung die genau vor einem Jahr im IE Blog vorgestellt wurde:

[2] http://blogs.msdn.com/b/ie/archive/2010/03/16/html5-hardware-accelerated-first-ie9-platform-preview-available-for-developers.aspx

Weiterhin spannend ist die Unterstützung der Geolocation API zur Standortbestimmung im Browser:

[3] http://msdn.microsoft.com/de-de/library/gg589502(v=VS.85).aspx

Persönlich finde ich die Integration von den Developer Tools (auf F12 drücken) im unteren Bereich praktisch. Hier kann man auch zwischen den verschiedenen Browser-Versionen des IE umschalten.

.NET Day Franken 2011

11.03.2011 16:30:00 | Thorsten Hans

Am 21.Mai 2011 findet zum zweiten mal der .NET Day Franken in Nürnberg statt. Nach dem sehr gelungenen Auftakt in 2010 veranstaltet das OrgaTeam um Thomas Müller und Bernd Hengelein auch dieses Jahr wieder eine Community Konferenz.

250x250IchBinDabei

Ich freue mich sehr auch dieses Jahr wieder einen Vortrag auf dem .NET Day Franken halten zu dürfen. Diesmal werde ich folgenden Vortrag halten

  • SharePoint 2010 als Entwicklungsplattform
    • SharePoint 2010 bietet mehr als nur eine Plattform für die effektive Zusammenarbeit; SharePoint 2010 stellt eine sehr gute Plattform zur Anwendungsentwicklung bereits, mit deren Hilfe verschiedenste Szenarien realisiert werden können. Sehen Sie im Rahmen dieser Session was benötigt wird um mit SharePoint 2010 zu entwickeln und lernen Sie die unterschiedlichen Möglichkeiten kennen, die SharePoint 2010 Ihnen als Softwareentwickler – zum Erstellen von eigenen Anwendungen - bietet.

Wie auch letztes Jahr ist das Lineup an Speakern und Vorträgen sehr gut, so dass sich ein Besuch in Nürnberg auf jeden Fall lohnt.

 

DotNetKicks-DE Image

Umfrage: Visual Studio/ALM-Konferenz 2011 – Ihre Meinung ist gefragt!

11.03.2011 15:40:05 | Peter Kirchner

clip_image002

Microsoft beabsichtigt, in den nächsten 12 Monaten wieder eine Konferenz für Entwickler, Tester und IT-Entscheider und -Projektleiter mit Schwerpunkt Application Lifecycle Management mit Visual Studio und Team Foundation Server zu veranstalten. Diese Konferenz ist als Nachfolgerin der erfolgreichen TeamConf-Konferenzen gedacht – mit der Namensvereinfachung von Visual Studio Team System 2008 zu Visual Studio 2010 wird die Konferenz auch einen neuen Namen bekommen.

Bitte helfen Sie uns, auch die neue Konferenz zu einem Erfolg für Sie als Visual Studio-Anwender zu machen: Füllen Sie dazu Fragebogen aus und geben Sie uns Feedback, Wünsche und Anregungen zu einer Konferenz zu den Schwerpunkten Application Lifecycle Management, Teamzusammenarbeit und Testing/QS mit Visual Studio und Team Foundation Server.

Unter allen Teilnehmern der Umfrage wird ein Konferenzticket verlost, die Umfrage kann natürlich auch anonym ausgefüllt werden.

Direkt zur Umfrage: Was wünschen Sie sich auf der Microsoft Visual Studio ALM-Konferenz 2011

ShareConf 2011 in Düsseldorf

11.03.2011 15:30:00 | Thorsten Hans

Die ShareConf 2011 (SharePoint 2010 Konferenz) findet zum zweiten Mal in Düsseldorf statt. Neben der Hauptveranstaltung, welche vom 08. – 09. Juni 2011 stattfinden wird, wird es am 07. Juni 2011 einen Workshoptag zum Thema SharePoint 2010 geben.

Neben bekannten Speakern aus dem SharePoint Umfeld wie

Werde auch ich hier mit zwei Sessions vertreten sein

  • Data Please, Mr.Sharepoint
    • SharePoint 2010 bietet verschiedene Möglichkeiten Daten zu konsumieren. Thorsten Hans, Autor des Blogs „.NET rocks“, zeigt welche Zugriffstechniken es gibt und wann welche Technologie verwendet werden sollte. Neben dem Client Object Model, wird auch die Verwendung der SharePoint RESTful WebServices erläutert.
  • Silverlight in SharePoint 2010
    • Abstract folgt noch :-)

Alle, die sich mit SharePoint 2010 beschäftigen oder dies tun wollen, sollten sich mindestens zwei Tage Zeit nehmen und den Weg nach Düsseldorf aufsuchen. Die ShareConf lohnt sich für jeden, sei es IT-Pro, Management oder Entwickler.

 

DotNetKicks-DE Image

DotNet DevCon in Nürnberg

11.03.2011 14:30:00 | Thorsten Hans

Die .NET DevCon ist eine Entwicklerveranstaltung der dotnetpro , dem Fachmagazin für .NET, Visual Basic, C++ und VBA für Softwareentwickler. Die Entwicklerkonferenz findet vom 06. - 07. Juni 2011 in derMeistersingerhalle in Nürnberg statt.

logo_twitter_withbird

 

Im Rahmen der .NET DevCon werde ich folgende Sessions halten

  • Exploring MVVM in Silverlight
    • Das Model-View-ViewModel-Pattern, kurz MVVM, findet immer mehr Anhänger in der .NET-Entwicklergemeinde. Lernen Sie die Grundkonzepte von MVVM kennen und sehen Sie diese im praktischen Einsatz. Im weiteren Verlauf des Vortrages sehen Sie, wie man das MVVM Framework Caliburn Micro in Silverlight-Anwendungen einbinden kann und wo dessen Vorteile liegen.
  • SharePoint als Backend (Data please, Mr. SharePoint)
    • SharePoint 2010 bietet verschiedene Möglichkeiten, Daten zu konsumieren. Thorsten Hans zeigt, welche Zugriffstechniken es gibt und wann welche Technologie verwendet werden sollte. Neben dem Client Object Model wird auch die Verwendung der SharePoint RESTful Web Services erläutert. Die Client Access-Technologien von SharePoint 2010 erlauben leichtgewichtige, verteilbare Lösungen, die SharePoint 2010 als Anwendungsplattform nutzt.

Neben meinen Vorträgen sind auch viele interessante Sessions von namhaften Speakern aus dem deutschsprachigem Raum wie zum Beispiel

Dabei sein lohnt sich, daher gilt es sich so schnell wie möglich hier anzumelden.

DotNetKicks-DE Image

MSBuild Vortrag bei der .NET UserGroup Frankfurt

11.03.2011 13:30:00 | Thorsten Hans

Am Donnerstag den 17.03.2011 werde ich einen Vortrag zum Thema MSBuild bei der .NET UserGroup in Frankfurt halten. Das Meeting startet um 18:30 Uhr und findet in der Geschäftsstelle von Microsoft in Bad Homburg statt.

DotNet_User_Group_Logo_Web_4

Im Rahmen des Vortrages werde ich die Grundbausteine von MSBuild vorstellen und anhand von alltäglichen Szenarien die Verwendung von MSBuild erläutern.

Wenn ihr am UserGroup treffen teilnehmen wollt, könnt ihr euch hier anmelden.

 

Technorati Tags: ,,,
DotNetKicks-DE Image

dotnet Cologne 2011 : Anmeldung ab 14. März

11.03.2011 08:55:48 | Roland Weigelt

Am 6.5.2011 findet in Köln die dotnet Cologne 2011 statt, eine von der .NET User Group Köln und der von mir geleiteten Gruppe Bonn-to-Code.Net gemeinsam organisierte Community-Konferenz rund um .NET.

Die “dotnet Cologne” hat sich mittlerweile als die große .NET Community- Konferenz in Deutschland etabliert. So war die letztjährige dotnet Cologne 2010 mit 300 Teilnehmern bereits einen Monat im Voraus ausgebucht.

Und heise online schrieb: “Inzwischen besitzt die dotnet Cologne ein weites Einzugsgebiet. Die Teilnehmer kommen nicht mehr ausschließlich aus dem Kölner Umfeld, sondern aus allen Teilen Deutschlands [...] Die gute Qualität des Vorjahres in Verbindung mit einem geringen Preis hat sich schnell herumgesprochen, sodass Teilnehmer aus Bayern oder Thüringen keine Ausnahme waren.

Auch in diesem Jahr erwartet die Teilnehmer ein ganzer Tag voll mit Themen rund um .NET. Auf der Website http://www.dotnet-cologne.de sind dazu jetzt die ersten Vorträge, Sprecher sowie Infos zur Anmeldung veröffentlicht.

Die Anmeldung ist ab Montag, den 14.3.2011 um 14:00 freigeschaltet.

Es empfiehlt sich, schnell zu handeln, denn für die 100 ersten Teilnehmer gilt der “Super-Early Bird” Preis von nur 25,- Euro; diese Plätze waren letztes Jahr in Nullkommanix weg.

Die Teilnehmer 101 – 200 zahlen den “Early Bird” Preis von 40,- Euro, ab Platz 201 gilt der “Normalpreis” von 55,- Euro.

Aber egal ob “Super-Early”, “Early” oder “Normal”: 25 Vorträge auf 5 Tracks, gehalten von bekannten Namen der .NET Community, dazu den ganzen Tag über Verpflegung und Getränke – das ist zu diesem Preis ein sehr attraktives Angebot.

Wir haben damit eine Konferenz organisiert, die wir selbst gerne besuchen würden. Ganz im Sinne “von Entwicklern, für Entwickler”.

Was ist neu?

Das Feedback vom letzten Jahr war sehr positiv, den Leuten hat’s einfach gut gefallen. Gleichwohl haben wir Feedback-Bögen, Blog-Einträge und Tweets sehr aufmerksam ausgewertet und bei der Organisation berücksichtigt:

  • Der neue Veranstaltungsort, das Komed im Mediapark Köln, ist zentral gelegen und verfügt über günstige Parkmöglichkeiten
  • Die Räumlichkeiten bieten mehr Platz für Teilnehmer, Sponsoren und natürlich auch das Mittagessen
  • Wir haben dieses Jahr einige etwas speziellere Vorträge auf Level 300 und 400 im Programm, um neben fundierten Einführungen in Themengebiete auch “Deep Dives” für Experten anbieten zu können.
  • Längere Pausen zwischen den Vorträgen ermöglichen es den Teilnehmern besser, nach den Vorträgen mit den Sprechern verbleibende Fragen zu klären, sich an den Sponsorenständen Infos zu holen oder einfach Kontakte mit Gleichgesinnten zu knüpfen.

Was das Fördern der Kommunikation unter den Teilnehmern angeht, haben wir schon die eine oder andere Idee im Kopf. Aber einiges davon hängt nicht zuletzt von finanziellen Faktoren ab – und damit sind wir schon beim Thema:

Es gibt noch Sponsoring-Möglichkeiten!

Die dotnet Cologne 2011 ist die Gelegenheit, Produkte vorzustellen, neue Mitarbeiter zu suchen oder generell den Namen einer Firma bei den richtigen Leuten zu platzieren. Nicht ohne Grund unterstützen uns viele Sponsoren dieses Jahr zum wiederholten Mal. Vom Software-Sponsor für die Verlosung bis hin zum Aussteller vor Ort – es gibt vielfältige Möglichkeiten und wir schicken auf Anfrage gerne unsere Sponsoreninfos zu.

Die Anmeldepforten der dotnet Cologne 2011 öffnen sich

11.03.2011 01:23:34 | Albert Weinert

Am 6. Mai 2011 findet die .NET Community Entwickler Konferenz statt, die dotnet Cologne 2011.

Zum dritten mal findet sie nun statt und wir haben uns eurer Feedback zu Herzen genommen.

So gibt es dieses Jahr u.a. folgende Verbesserungen

  • 30 Minuten Pause für mehr Netzwerken, Diskussionen.
  • Wir haben ein paar, richtige, Deep Dives im Programm
  • Mehr Platz in den Pausen für Essen, Teilnehmer und Sponsoren
  • Zentral gelegen
  • günstige Parkmöglichkeiten für Teilnehmer

Auch in diesem Jahr erwartet euch ein ganzer Tag voll mit Themen rund um .NET - 25 Vorträge auf 5 Tracks, von der fundierten Einführung bis zum hin zum "Deep Dive" für Spezialisten.

Das Erfolgsgeheimnis: Eine Handvoll Software-Entwickler setzen sich zusammen und organisieren eine Konferenz, die sie selbst gerne besuchen würden.

Das heißt: Top-Sprecher in einer Top-Location, Versorgung mit Essen und Trinken den ganzen Tag über und das Ganze zu einem unschlagbaren Preis: nur 25,- im "Super Early Bird".

Anmeldung ab dem 14.3.2011 um 14:00 Uhr

Roland Weigelt hat dazu auch was in schön geschrieben Winking smile 

Wie übergebe ich ein Array von POCO’s an den Controller in ASP .NET MVC 2

10.03.2011 22:33:00 | Lars Schmitt

 

Neulich hatte ich während der Implementations- Phase eines ASP.Net MVC 2 Projektes, ein kleines Problem.

Ich wollte eine HTML Tabelle, in welche man mit Hilfe dieser Tabelle auch neue Daten hinzufügen kann und diese im Anschluss zu speichern.

tableSample

 

Das Dynamische hinzufügen, war mittels JQuery selbstverständlich sehr schnell realisiert.

  

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<List<MvcApplication10.Models.Kunde>>" %>  

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">   
    Startseite    
</asp:Content>  

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">   
<% if (Model.Count > 0) %>    
<% { %>    
    <table id="templateTableRow" style="display:none">    
        <tr>    
            <td><%: Html.TextBox("Name")%></td>    
            <td><%: Html.TextBox("Vorname")%></td>    
            <td><%: Html.TextBox("Strasse")%></td>    
            <td><%: Html.TextBox("Hausnummer")%></td>    
        </tr>    
    </table>    
    <%using (Html.BeginForm()) %>    
    <% { %>    
    <table id="tbl">    
        <tr>    
            <th><%: Html.LabelFor(m => Model[0].Name) %></th>    
            <th><%: Html.LabelFor(m => Model[0].Vorname) %></th>    
            <th><%: Html.LabelFor(m => Model[0].Strasse) %></th>    
            <th><%: Html.LabelFor(m => Model[0].Hausnummer) %></th>    
        </tr>    
        <% foreach(var item in Model) %>    
        <% { %>    
        <tr>    
            <td><%: item.Name %></td>    
            <td><%: item.Vorname %></td>    
            <td><%: item.Strasse %></td>    
            <td><%: item.Hausnummer%></td>  

        </tr>   
        <% } %>    
    </table>    
    <input type="submit" value="save" />    
    <% } %>  

    <% } %>   
    <input type="button" value="Add" onclick="BLOCKED SCRIPT$('#tbl').append($('#templateTableRow').html())" />    
</asp:Content>    
  

  

public ActionResult Index()   
        {    
            List<Kunde> kunden = new List<Kunde>();  

            kunden.Add(new Kunde { Name = "Schmitt", Vorname="Lars", Strasse="...", Hausnummer="..."});   
            kunden.Add(new Kunde { Name = "...", Vorname="Walter", Strasse="...", Hausnummer="..."});  

            return View(kunden);   
        }  

 

 

Fein, das war ja einfach, jedoch der Schrecken folgt auf dem Fuße, denn nachdem ein paar neue Testdaten erfasst und das Formular abgeschickt wurde.

Gelangten die eingegebenen Daten, nicht in die dafür vorgesehene Generischen Liste vom Typ Kunde.

Fehler

 

Um diesem Fehler auf die Spur zu kommen, könnte man sich z.B. die übergebenen Daten anschauen.uebergebeneDaten

 

Warum wird mit dieser Daten das Model nicht gefüllt?

Hintergrund:

Die Daten die von einer Webseite, an die Controller Methode übergeben werden, werden erst durch einen so genannten ModelBinder, den einzelnen Parameter zugewiesen.

Zwar hat MS uns einen Default ModelBinder spendiert, jedoch kann dieser logischerweise auch nicht alle Fälle abdecken.

 

Da man jetzt gesehen hat, wie die Daten übergeben werden, könnte man auf die Idee kommen, ein neues Model zu erstellen welches die übergebenen Daten aufnehmen kann.

  

public class Kunde   
    {    
        public string[] Name { get; set; }    
        public string[] Vorname { get; set; }    
        public string[] Strasse { get; set; }    
        public string[] Hausnummer { get; set; }    
    }  

Jedoch wäre dieses der Falsche Weg!

 

Einige Suchanfragen später … Ein eigener ModelBinder muss her.

 

Um einen eigenen ModelBinder zu erstellen, muss nur das Interface IModelBinder aus dem Namensraum System.Net.MVC Implementiert werden.

  

public class KundenListModelBinder : IModelBinder   
    {    
        #region IModelBinder Member  

        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)   
        {    
            List<Kunde> kunden = new List<Kunde>();  

            NameValueCollection col = controllerContext.HttpContext.Request.Form;  

            var namen = col["Name"].Split(',');   
            var vornamen = col["Vorname"].Split(',');    
            var strassen = col["Strasse"].Split(',');    
            var hausnummern = col["Hausnummer"].Split(',');  

            Kunde kunde = null;   
            for (int i = 0; i < kunden.Count; i++)    
            {    
                kunde = new Kunde();  

                kunde.Name = namen<img src="http://dotnet-forum.de/emoticons/emotion-55.gif" alt="Idea" />;   
                kunde.Vorname = vornamen<img src="http://dotnet-forum.de/emoticons/emotion-55.gif" alt="Idea" />;    
                kunde.Strasse = strassen<img src="http://dotnet-forum.de/emoticons/emotion-55.gif" alt="Idea" />;    
                kunde.Hausnummer = hausnummern<img src="http://dotnet-forum.de/emoticons/emotion-55.gif" alt="Idea" />;  

                kunden.Add(kunde);   
            }  

            return kunden;   
        }  

        #endregion   
    }  

 

Um diesen ModelBinder, nun  auch benutzen zu können, muss er nur noch dem MVC Framework bekannt gemacht werden.

 

Wie so oft, gibt es nicht nur einen Weg dieses zu bewerkstelligen.

1. Die Globale Methode

Der ModelBinder kann, innerhalb der Global.asax dem Framework bekanntgemacht werden.

  

protected void Application_Start()   
        {    
            ModelBinders.Binders[typeof(List<Kunde>)] = new KundenListModelBinder();  
        }  

 

2. Die Lokale Methode (von mir bevorzugt)

Der Modelbinder kann aber auch immer nur da, wo er auch wirklich benötigt wird angegeben werden.

  

public ActionResult Index([ModelBinder(typeof(KundenListModelBinder))] List<Kunde> kunden)   
       {    
           return View(kunden);    
       }  
  

 

abschließend natürlich der Beweis, dass es auch wirklich klappt

fertig

22.03.2011 Treffen der DNUG Braunschweig - Retrospektiven: Durch ständige Kurskorrekturen zum Projekterfolg

10.03.2011 11:23:00 | Lars Keller

Die DNUG Braunschweig trifft sich am 22.03.2011 um 19:00 im Restaurant Zucker (Tagungsraum). Uns kommt Jutta Eckstein mit einem Vortrag zur agilen Softwareentwicklung besuchen.

Retrospektiven sind eine Grundvoraussetzung für agiles Vorgehen. Mit ihrer Hilfe lassen sich Probleme frühzeitig erkennen und Korrekturen einfach vornehmen, beides ermöglicht letztendlich erst den Projekterfolg.
In diesem Vortrag werden Retrospektiventechniken vorgestellt und es wird erläutert, welche Arten von Retrospektiven es gibt und wann sie am erfolgreichsten eingesetzt werden.

Bio:
Jutta Eckstein (it-communication.com, je@it-communication.com), Partner von IT communication, arbeitet seit über zehn Jahren als Coach, Beraterin und Trainerin im In- und Ausland. Weltweit verfügt sie über eine einzigartige Erfahrung bei der erfolgreichen Umsetzung agiler Prozesse in mittleren bis großen, verteilten, unternehmenskritischen Projekten, wovon auch ihre Bücher ‚Agile Softwareentwicklung mit verteilten Teams‘ und ‚Agile Softwareentwicklung im Großen‘ handeln. Sie ist Mitglied der AgileAlliance und im Programmkomitee verschiedener europäischer und amerikanischer Konferenzen zu den Themen agiles Vorgehen, Objektorientierung und Patterns.

Wie immer ist dieses Event kostenlos und jeder .NET Interessierte ist herzlich willkommen!

Weitere Informationen zur DNUG Braunschweig findest du hier.

Artikel in dot.net-Magazin 4.2011

09.03.2011 22:25:00 | Patric Schouler

Mein Artikel “Windows Phone 7 – Alles unter Kontrolle” mit einem Überblick über die Windows Phone 7 Controls und deren Einsatz ist jetzt im dot.net-Magazin 4.2011 erschienen.

Cover_dotnetmagazin04211

Released: VS/TFS 2010 SP1 und TFS-Project Server Integration Feature Pack

09.03.2011 08:43:40 | Christian Binder

Für MSDN Subscriber Hier zum Download:

image

Wer die Project Server Integration Live sehen möchte, empfehle ich die Session von der TechEd 2010. Aaron und Christophe zeigen in zwei Szenarien, wie die Integration für agil und formal arbeitende Teams funktionieren kann. SP1 ist die Voraussetzung für die Project Server Integration.

Mehr Details zum VS und TFS SP1 als auch zur Project Server Integration gibt’s hier.

Viel Spass

Update: Team Foundation Server Power Tools März 2011

09.03.2011 08:07:04 | Christian Binder

Die neuen Power Tools sind hier verfügbar. Im letzten Release war das Backup Tool in der TFS MMC neu hinzugekommen, was allerdings noch einige Bugs hatte. Allein für das Update des Backup Tools lohnt sich der Download.  Zusätzlich ist die Version Control Shell um einige Features, wie z.B. Shelves erweitert worden. Für Alle interessant, die mit TFS Version Control arbeiten und dies direkt aus Windows heraus.

image

Weitere Details gibt’s auf Brian’s blog.

Auch neu sind die Team Foundation Server Build Extensions Power Tool März 2011, welche Updates für die ANT und Maven2 Build Integration enhält. Als auch eine XML Transformation für Testergebnisse von JUnit, um diese im TFS nutzen zu können.

Viel Spass

NEW Version 3.8 TeamSpeak Sidebar Gadget für Windows Vista und Windows7

08.03.2011 19:48:00 | Andreas Mehl

I recommend you update to the latest version 3.8.

 

Screenshots can be found here: Screenshots

New Video can be found here: Video

Documentation can be found here: Documentation

Have fun Laughing

Download Sidebar Gadget Teamspeak 3.8

Neue Folge von Silverlight-Expertise: E-Mail versenden, Reactive Coding und WP7 Emulator mit Tastatur bedienen

08.03.2011 11:51:19 | Gregor Biswanger

dotnet-magazin-logo

In der aktuellen Ausgabe vom dot.net magazin gibt es eine neue Folge von meiner Silverlight-Kolumne “Silverlight-Expertise”:

Silverlight-Expertise - Die Crème de la Crème des Monats
Die Serie „Silverlight Expertise“ des dot.NET Magazins präsentiert monatlich zwei leckere Top-How-Tos zum Thema Silverlight von Gregor Biswanger (www.dotnet-blog.net), sodass Einsteiger und fortgeschrittene Silverlight-Experten durch geballtes Wissen gesättigt werden. Heute stehen auf der Menükarte „E-Mail versenden“ und „Reactive Coding“. Viel Spaß und einen guten Appetit.

 

Windows_Phone_Logo_Horizont

Mit dabei ist jeweils ein How-To zum Thema Windows Phone 7. Hier steht auf der Menükarte: “WP7 Emulator mit Tastatur bedienen”.

 

original4d74b43f3b9c5

 

Zu lesen sind die How-To´s beim dot.net magazin, Ausgabe 04/2011

Vom Visual Studio zum Wix Setup in 5 einfachen Schritten

08.03.2011 04:13:00 | Jürgen Gutsch

Der folgende Beitrag ist ein Gastbeitrag von Sebastian Seidel, Gründer und Inhaber der Firma Cayas (http://www.cayas.de/). Vor einigen Monaten hatte ich per Twitter die Frage gestellt, wie man aus einem herkömmlichen Visual Studio Setup-Projekt ein Windows Installer XML-Projekt (WiX) erstellt. Falls es weitere Fragen zu WiX gibt, ist Sebastian über seine Website oder per Twitter zu erreichen.

Von meiner Seite ein großes Dankeschön an Sebastian, dass er sich die Mühe gemacht hat hier eine Anleitung zur Migration zu schreiben und hier zu veröffentlichen :-)

--------------

Vom Visual Studio zum Wix Setup in 5 einfachen Schritten

Vor einiger Zeit wurde über Twitter die Frage gestellt, wie man ein bestehendes Visual Studio Setup-Projekt (vd-proj) in ein Windows Installer XML-Setup (wixproj) migriert. Ich möchte an dieser Stelle einen möglichen Weg aufzeigen, wie man dies erreichen kann.

Schritt 1: Vorbereitung

Um die Schritte nachvollziehen zu können benötigt ihr die aktuelle Version von Wix, die ihr unter http://wix.sourceforge.net herunterladen könnt. In diesem Artikel verwende ich die aktuelle Version 3.5 des Windows Installer XML Toolsets.

Nach dem alles installiert und ins Visual Studio integriert ist solltet ihr folgendes Bild haben, wenn ihr ein neues Projekt erstellen wollt.

Beginnen wir nun also mit der Konvertierung.

Schritt 2: altes Setup erstellen

Im eigentlichen ersten Schritt bleibt alles wie gehabt. Ihr erstellt also euer Setup über die VS-Setup Solution. Das Ergebnis des Builds ist eine Setup.exe und ein Setup.msi-Paket.

Schritt 3: altes Setup dekompilieren

Für das unter Schritt 2 erstelle msi-Paket erstellen wir uns einen Ordner WixTransform auf dem Desktop und kopieren unser msi-File dort hin. Anschließend öffnen wir eine Command-Box (cmd) und wechseln in das Installationsverzeichnis vom Windows Installer XML. Darin befindet sich eine Datei namens Dark.exe, die wir mit dem Parameter -h aufrufen. Im folgenden Bild sieht man einen Teil der ausgegebenen Parameter, die mit Dark verwendet werden können.

Uns interessiert nur der -o[ut] Parameter mit dem wir angegeben können, wohin wir den Output umgeleitet haben möchten.

Hinweis: Dark kann nicht mit Leerzeichen im Pfad umgehen. Ich behelfe mir damit, dass ich mein msi-Paket in einen Ordner auf dem Desktop kopiere und alle Leerzeichen entferne.

Wir haben nun alle Vorbereitungen erledigt und können mit der eigentlichen Konvertierung beginnen. Dazu geben wir folgenden Aufruf ein:

Dark.exe -nologo -o C:\Users\Sebastian\Desktop\WixTransform\mySetup.wxs C:\Users\Sebastian\Desktop\WixTransform\Setup.msi

Wenn der Vorgang erfolgreich durchgeführt wurde, finden wir in unserem Ordner - bei mir WixTransform - nun eine mySetup.wxs, die den kompletten Aufbau unseres alten Setups enthält.

Schritt 4: Neues Setup-Projekt erstellen

Wir haben in den vorherigen Schritten unser Setup erstellt und es anschließend wieder in eine Windows Installer XML Source Datei konvertiert. Im letzten Schritt geht es nun darum diese zu nutzen. Wir wechseln dazu ins Visual Studio und fügen unserer Solution ein weiteres Projekt hinzu. Dieses Mal allerdings eins vom Typ Windows Installer XML Setup Projekt.

Unser leeres Projekt besteht lediglich aus der Product.wxs, welche wir löschen bzw. durch unsere mySetup.wxs ersetzen.

Schritt 5: Aufräumen

Damit unser Setup nun wieder ordnungsgemäß erstellt werden kann müssen wir unsere mySetup.wxs noch aufräumen. Die folgende Beschreibung gibt meine Vorgehensweise wieder. Sicherlich gibt es verschiedene Wege das Ziel zu erreichen. Wenn Ihr also einen optimaleren Weg gefunden habt, so lasst es mich doch wissen, in dem Ihr einfach ein Kommentar schreibt.

Fangen wir also an in dem wir unsere mySetup.wxs von oben nach unten durchgehen. Zuerst entferne ich alle <Binary>, <CustomAction>, <CustomTable> und <Property> Elemente. Ausgenommen sind natürlich die CustomActions, die ich eventuell auch in meinem ursprünglichen VS-Setup eingebunden hatte sowie die folgenden und meine eigenen Properties:

<Property Id="ARPHELPTELEPHONE" Value="1234 1234567" />
<Property Id="ARPCONTACT" Value="Sebastian Seidel" />
<Property Id="ARPCOMMENTS" Value="Mein Produktname" />
<Property Id="ARPURLINFOABOUT" Value="http://www.cayas.de" />
<Property Id="ARPPRODUCTICON" Value="IconSource" />

Anschließend ändere ich die kryptischen <Component> IDs zu aussagekräftige ab. Da ich meine Dialoge in einer separaten Datei erstellt habe, lösche ich auch das <UI> XML-Node. Wer möchte kann an dieser Stelle noch Einfluss auf die Dialoge nehmen und diese entsprechend anpassen.

Zu guter Letzt entferne ich noch alle Nodes, die ein Sequence enthalten. Auch das kann wieder jeder halten wie er möchte. Grundsätzlich kann man mit diesen Sequenzanweisungen viel Einfluss auf das Ausführungsverhalten des Setups nehmen.

In einem letzten Durchgang passe ich dann alle Source-Elemente an, damit diese wieder die richtigen Dateien referenzieren.

DotNetKicks-DE Image

Fünf Jahre Bonn-to-Code.Net – das muss gefeiert werden!

07.03.2011 18:09:04 | Roland Weigelt

Als ich am 1. Januar 2006 die .NET User Group “Bonn-to-Code.Net” gründete (den genialen Namen ließ sich mein Kollege Jens Schaller in Anlehnung an das Motto meines Blogs einfallen), ahnte ich nicht, wie schnell sich alles entwickeln würde. So konnte, nach ein wenig Werbung über diverse Kanäle, bereits am 14. Februar 2006 das erste Treffen stattfinden und wenige Tage später wurde Bonn-to-Code.Net offiziell in den Kreis der INETA User Groups aufgenommen.

Das ist nun etwas über fünf Jahre her und soll am 22. März 2011 um 19:00 (Einlass ab 18:30) gebührend gefeiert werden, und zwar im Rahmen unseres März-Treffens.

Der Abend bietet Vorträge zu “Flow Design und seine Umsetzung mit Event Based Components” sowie “WCF Services mal anders” (ausführlichere Infos zu den Vortragsinhalten gibt es hier).

Anschließend gibt es bei einer großen Verlosung neben Büchern auch hochkarätige Software-Preise zu gewinnen. Zusätzlich zu Lizenzen für JetBrains ReSharper und Telerik Ultimate Collection warten dieses Mal (mit freundlicher Unterstützung durch Microsoft Deutschland) je ein Windows 7 Ultimate und ein Office 2010 Professional Plus auf ihre glücklichen Gewinner. Und wer nicht zu spät kommt, kann auch ganz ohne Losglück eines von vielen kleinen Goodies abgreifen.

Eine Anmeldung ist nicht erforderlich, eine Anfahrtsbeschreibung gibt es auf der Bonn-to-Code.Net Website.

Es freut mich dabei besonders, dass wir zu diesem Termin u.a. einen Sprecher an Bord haben, der bereits beim Gründungstreffen dabei war: Stefan Lieser. Mittlerweile z.B. durch die Clean Code Developer Initiative bekannt, ist Stefan nur ein Beispiel für eine ganze Reihe von Sprechern auf den diversen Entwicklerkonferenzen, die ihre ersten Erfahrungen u.a. bei Bonn-to-Code.Net gemacht haben.

…und was ist in den fünf Jahren so passiert?

Einiges! Ein Community Launch Event in 2007, zwei Microsoft TechTalks (2007,2008), Gastsprecher aus ganz Deutschland und dem Ausland (JP Boodhoo, Harry Pierson). Doch nichts hat die fünf Jahre so geprägt wie die Zusammenarbeit mit “den Nachbarn aus Köln”.

Zum Zeitpunkt der Gründung von Bonn-to-Code.Net gab es im gesamten Köln/Bonner Raum keine .NET User Group. Und so war es nicht ungewöhnlich, dass der erste Interessent, der sich auf meinen Blog-Eintrag vom 4. Januar 2006 hin meldete, aus Köln stammte: Albert Weinert.

Kurze Zeit nach der Bonner Gruppe wurde dann – initiiert durch Angelika Wöpking und Stefan Lange – schließlich die .NET User Group Köln gegründet. Wobei Stefan wiederum vor dem Kölner Gründungstreffen Ende April bereits Bonner Treffen besucht hatte; insgesamt also eine Menge personeller Überlapp zwischen Köln und Bonn.

Als nach einem etwas holprigen Start der Kölner Gruppe schließlich Albert und Stefan die Leitung übernahmen, war klar dass Köln und Bonn in vielerlei Hinsicht eng zusammenarbeiten würden. Sei es durch die Koordination von Themen und Terminen oder auch durch Werbung für die Treffen der jeweils anderen Gruppe.

Der nächste Schritt kam dann mit der Beteiligung der Kölner und Bonner Gruppen an der Organisation des “AfterLaunch” im April 2008. Der große Erfolg dieser Veranstaltung war der Ansporn, in Bezug auf die Zusammenarbeit ein neues Kapitel aufzuschlagen.

Anfang 2009 wurde zunächst der dotnet Köln/Bonn e.V. gegründet, um für eigene Großveranstaltungen ein solides Fundament zu schaffen. Im Mai 2009 folgte dann die erste “dotnet Cologne” – ein voller Erfolg. Und mit der “dotnet Cologne 2010” etablierte sich diese Konferenz als das große .NET Community Event in Deutschland.

Am 6. Mai 2011 findet nun die “dotnet Cologne 2011” statt; hinter den Kulissen laufen die Vorbereitungen dazu bereits seit Monaten auf Hochtouren.

Alles in allem sehr aufregende fünf Jahre, in denen viel passiert ist. Mal schauen, wie die nächsten fünf Jahre werden…

XHTML1.1 valide mit BlogEngine.NET

06.03.2011 17:59:35 | Klaus Bock

BlogEngine.NET

… ist es überhaupt möglich?
Ja; allerdings sind dazu einige “Kunstkniffe” nötig.
Als erstes müssen die diversen &–Zeichen im HTML durch die korrekte Entität &amp; ersetzt werden. Außer den eigenen Widgets, Benutzersteuerelementen oder Erweiterungen, bietet hier BlogEngine.NET noch jede Menge Vorkommen im Quellcode. Die meisten sind leicht mit Hilfe der Suche zu finden. Einige verstecken sich jedoch an ungeahnten Stellen. Folgend zwei Beispiele, für zwei üble Verstecke die leicht übersehen werden können.

Als erste das Benutzersteuerelement CommentView.ascx im jeweils verwendeten Theme-Ordner. Es stellt mit den jeweiligen Kommentaren auch die URL der Webseite des Kommentator dar. Darunter fallen auch die Webseiten von angegebenen Trackback oder Pingback-Kommentaren.
Diese enthalten oftmals Parameter und somit auch das &-Zeichen. Das Benutzersteuerelement stellt den Wert der Eigenschaft Comment.Website einfach in einer Verknüpfung mit dem Namen des Kommentators dar, ohne den Inhalt der Eigenschaft zu überprüfen. bzw. zu kodieren.
An dieser Stelle schafft ein einfaches Kodieren mittels HtmlEncode Abhilfe.

<div class="visitor">
	<%= Comment.Website != null
		? "<a href=\"" + this.Server.HtmlEncode(Comment.Website.ToString()) + "\" rel=\"nofollow\" class=\"url fn\">" + Comment.Author + "</a>"
		: "<span class=\"fn\">" + Comment.Author + "</span>" %>
    <%= Flag %>
    <div class="comment_date"><%= Comment.DateCreated %><a href="#id_<%=Comment.Id %>">#</a></div>
</div>

Ein weiteres Versteck ist die Klasse Avatar.cs im Projekt DotNetSlave.BusinessLogic.
Diese Klasse wird vom Benutzersteuerelement CommentView.ascx zur Darstellung des Avatar eines Kommentators verwendet. Dabei wird als src-Attribut des img-Tag die angegebene Track- oder Pingback Adresse verwendet, um mit websnapr.com eine Grafik als Avatar darzustellen.
Der Entwickler der Klasse Avatar.cs hat hier versucht die URL der Webseite via UrlEncode zu entschärfen. Doch leider wird bei der Kodierung mit UrlEncode das &-Zeichen nicht übersetzt. Hierzu muss HtmlEncode verwendet werden. Die betreffende Stelle ist im Quellcode der Datei Avatar.cs bei Zeile 92 zu finden.

url =
    new Uri(
        string.Format(
            "http://images.websnapr.com/?url={0}&amp;size=t",
            HttpUtility.HtmlEncode(website.ToString()))); //HttpUtility.UrlEncode(website.ToString())));

Soweit zu den Anpassungen in BlogEngine.NET.
Als nächstes muss eine Unart von ASP.NET beseitigt werden, ohne die eine Validierung höher als XHTML1.0 Transitional nicht möglich ist. Es geht dabei um das name-Attribute des form-Tags, das außer von ASP,NET von niemandem sonst benötigt wird. Nur so einfach wird man dieses Attribut nicht los. In der Deklaration einer Form in Visual Studio, ist das Attribute nicht vorhanden. Es wird erst beim verarbeiten der Form von ASP.NET hinzugefügt. Demzufolge muss das Attribut auch erst nach der Verarbeitung wieder Entfernt werden.

Die einfachste Möglichkeit um das ungeliebte Attribut loszuwerden, bietet die Verwendung eines HttpResponse.Filter, wie schon einmal im Artikel über das Entfernen von nutzlosen Whitespace zur Laufzeit gezeigt. So ein Filter ist nichts weiter als eine Klasse die von der abstrakten Klasse Stream erbt. In ihr wird in der Methode Write der form-Tag entsprechend bearbeitet.

public override void Write(byte[] buffer, int offset, int count)
{
    var sb = new StringBuilder(this.ResponseEncoding.GetString(buffer));
    sb.Replace("<form name=\"aspnetForm\"", "<form");
    HtmlOptimizationFilter.CorrectErrors(sb);

    foreach (var entry in this.CommentsToRemove)
    {
        sb.Replace(entry, null);
    }

    if (this.TranslateEntities)
    {
        HtmlOptimizationFilter.TranslateHtmlEntities(sb);
    }

    var outData = this.RemoveUnneededWhiteSpaces
        ? HtmlOptimizationFilter.RemoveWhiteSpaces(sb, this.ResponseEncoding)
        : this.ResponseEncoding.GetBytes(sb.ToString());
    this.sink.Write(outData, 0, outData.GetLength(0));
}

Hier ist nur die Zeile 284 von Belang. Der andere Code in der Methode kann ignoriert werden.
Damit der Filter auch verwendet wird, muss er natürlich auch irgendwo in die Anwendung eingebunden werden. Innerhalb von BlogEngine.NET bietet sich das enthaltene Kompressionsmodul CommpressionModule.cs im Projekt DotNetSlave.BusinessLogic an, da hier bereits ein eigener Filter verwendet wird. In der statischen Methode ContextPostReleaseRequestState kann der Filter folgendermaßen verwendet werden:

private static void ContextPostReleaseRequestState(object sender, EventArgs e)
{
    var context = ((HttpApplication)sender).Context;
    if (context.CurrentHandler is Page
        && context.Request["HTTP_X_MICROSOFTAJAX"] == null
        && context.Request.HttpMethod == "GET")
    {
        CompressResponse(context);

        context.Response.Filter =
            new HtmlOptimizationFilter(context.Response.Filter)
            {
                CommentsToRemove = new string[]
                {
                    "<!-- Start custom code -->",
                    "<!-- End custom code -->"
                },
                RemoveUnneededWhiteSpaces = true,
                TranslateEntities = true
            };

        if (BlogSettings.Instance.CompressWebResource)
        {
            context.Response.Filter = new WebResourceFilter(context.Response.Filter);
        }
    }
    else if (!BlogSettings.Instance.CompressWebResource
			  && context.Request.Path.Contains("WebResource.axd"))
    {
        context.Response.Cache.SetExpires(DateTime.Now.AddDays(30));
    }
}

In Zeile 134 wird der Filter verwendet und der bisherige Filter, der ja auch ein Objekt vom Typ Stream darstellt, an den Filter übergeben. Die an die verschiedenen Eigenschaften des Filter übergebenen Werte sind im Moment nicht weiter wichtig.

Jetzt muss nur noch der richtige Doctype in der Masterpage des verwendeten Theme eingesetzt werden und der Validierung nach XHTML1.1 steht nichts mehr im Weg.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

Wahrscheinlich werden bei den ersten Versuchen noch ein paar Fehler oder Warnungen, betreffend des einen oder anderen übersehenen Steuerzeichens auftauchen. Die “gröbsten Schnitzer” sollten allerdings bereits beseitigt sein.
Interessierte können sich den verwendeten Filter gerne herunterladen.

HtmlOptimizationFilter.zip

Fazit:

Ist die Umstellung des Doctype von XHMTL1.0 Transitional auf XHTML1.1 überhaupt nötig?
Für den alltäglichen Gebrauch des Blog sicher nicht. Mit dem Fortschreiten der Entwicklung von (X)HTML5 gewinnt valider Code immer mehr an Bedeutung. Mich reizte der Gedanke, die Codebasis von BlogEngine.NET gegen den experimentellen HTML5-Validator zu testen. Das Ergebnis war überraschend:
Würde ich mich vom meta-Tag PICS-Label trennen, währe die aktuell von mir verwendete Codebasis valide nach dem jetzigen Stand des HTML5-Validator.
Es währe allerdings Unsinn, zum jetzigen Zeitpunkt auf XHTML5 umzustellen, da aus der Codebasis von BlogEngine.NET einfach zu wenig Semantik zu holen ist.

Technorati-Tags: | |

Auf welchem Port läuft mein SQL Server (Express) 2008 R2? Oder: warum bekomme ich keine Verbindung?

06.03.2011 17:53:00 | Alexander Zeitler

Wann genau Microsoft die Einstellung geändert hat, konnte ich nicht genau nachvollziehen – bei der Neuinstallation einer benannten SQL-Server 2008 Express R2 Instanz trat der Effekt jedenfalls auf:

Man versucht, von einem Client aus per SQL Server (Native) Client auf den Server zu verbinden und erhält die Fehlermeldung:

Connection fail:
SQLState: 08001
SQL Server ERROR: 17
{Microsoft}{ODBC SQL Server Driver} {TCP/IP Sockets} SQL Server does not
exist or access denied

Zunächst prüft man natürlich folgende Punkte:

  • Sind Remote Connections erlaubt?
  • Sind Port 1433 und 1434 in der Firewall am Server eingehend geöffnet?
  • Ist das TCP/IP Client Protocol im Configruation Manager aktiviert?

Wenn dies erledigt ist und die Fehlermeldung bleibt, sollte man nochmal einen Blick in den SQL Server Configuration Manager werfen.

Unter “SQL Server Network Configuration” “Protocols for <InstanzName> kann man einsehen, ob die dynamische Portzuweisung aktiviert ist:

SQL Server Named Instance Dynamic Ports Active

Ist bei “TCP Dynamic Ports” eine 0 eingetragen, ist der dynamische Port auf dieser IP aktiv.

Doch welche Port-Nummer hat der dynamische Port?

Die Nummer findet man, wenn man in dem oben gezeigten Fenster ganz nach unten scrollt:

TCP Active Dynamic Port

Löscht man die “0” aus den “TCP Dynamic Ports”-Einträgen, kann man je IP unter “TCP Port” einen anderen fixen Port (z.B. den bekannten 1433) eintragen.

Man kann aber auch einfach bei “IPAll” (siehe Screenshot) in “TCP Dynamic Ports” den gewünschten Eintrag ändern, der dann für alle IPs gilt.

Danke an Alex für die Hilfe.

Update: Beachtet bitte auch den Hinweis von Mario in den Kommentaren.

DotNetKicks-DE Image

Wolkige Aussichten

03.03.2011 16:03:08 | Damir Tomicic

Ich kann mich noch gut an meinen Vortrag vor ca. zwei Jahren auf der ECM-Konferenz der Computerwoche in Frankfurt erinnern, wo ich das Thema "ECM in the Cloud" vorgestellt und mit dem Fachpublikum (überwiegend IT-Manager und technische Geschäftsführer) diskutiert habe. Damals war der Grundtenor des Publikums klar – noch mindestens 10 bis 15 Jahre müssen wir warten bis das Thema wirklich aktuell wird. Nicht viel anders klang es beim Treffen ded German Architects Councils. Wenn ich aber die aktuellen IT-Nachrichten betrachte, wundere ich mich wie diese 15 Jahren so schnell vergangen sind ..

Alles nur heiße Luft?


Wolkig ging es auch in Hannover zu - „Cloud Computing“ ist das große Leitthema der CeBIT 2011. Kaum eine Ecke der Ausstellung ist nicht mit irgendeinem Hinweis versehen, die Inhalte oder Services kämen „aus der Cloud“. Sogar die Besucher wurden kurzerhand „in die Cloud“ verschoben und mit diversen Services bedient.

Es freute mich sehr, als sich eine wirklich seltene und daher umso spannendere Gelegenheit für den Austausch zum Leitthema mit Jean-Philippe Courtois, President Microsoft International bei der Microsoft Corporation, Ralph Haupter, Geschäftsführer der Microsoft Deutschland und Dr. Said Zahedani, Mitglieder der Geschäftsleitung und Senior Director der DPE Gruppe, während der CeBIT ergab.



Denn auch Microsoft setzt auf die Cloud [1], sieht sich sogar als die „Cloud Company“ und bietet ein breites Portfolio an Lösungen in diesem Bereich an. Es war die richtige Zeit für die Frage „Quo Vadis Microsoft?“ in Sachen Cloud.

Wolkige Aussichten bei Microsoft

Gleich am Dienstagmorgen hat Jean-Philippe in Rahmen der CeBIT Global Confernce eine Keynote zum Thema Cloud Computing gehalten und eine Einführung in das Thema sowie in die Herausforderungen der heutigen IT-Welt.

Mit den Cloud-basierten Angeboten wird eine bereits vorhandene globale IT-Infrastruktur verwendet, die von einem externen IT-Team betrieben und auf dem letzten Stand gehalten wird. Die notwendige Skalierung, weltweite Zugänglichkeit und Verfügbarkeit wird on-demand bereit gesteellt und gehört zum Versprechen eines Cloud Angebots dazu – der Nutzer erhält nicht die Einsicht in die Welt hinter den Kulissen, jedoch die notwendige Leistung und die Skalierung, die er benötigt. Gleichzeitig entfällt die Notwendigkeit eigene Infrastrukturen aufzubauen, zu betreiben und zu administrieren. Damit wären die Themen Konsolidierung und Kosteneinsparrungen auch plausibel dargestellt, ohne weiter hier ins Detail zu gehen ..

Das wär’s auch, wenn Cloud Angebote nur die Basis der IT-Infrastruktur (Hardware, Betriebssystem und Server) zur Verfügung stellen würden. Schnell wird auch die Frage nach Flexibilität, Elastizität und Dynamik ins Spiel gebracht. Mit Windows Azure geht Microsoft den Schritt weiter und bietet neben der Infrastruktur auch die Entwicklungsplattform samt notwendigen Services in der und für die Cloud mit an. Damit wird umfassend für die Skalierung mit den Anwendungen, die bereits für die Verwendung in der Cloud-basierten Umgebungen erstellt worden sind, gesorgt. Vorausgesetzt natürlich es wird Service-orientiert gedacht und die Entwicklungsplattform sinvoll in die eigene Software-Architektur integriert.

Auf Basis dieser kurzen Ausführung ergeben sich schon die Vorteile der Verwendung der Cloud, bei Microsoft in diesem Fall der Windows Azure Plattform, bei großen Unternehmen, die vorwiegend global tätig sind und große Rechenzentren unterhalten. Es ist insofern auch nicht verwunderlich, dass ziemlich alle großen Firmen in Deutschland eine „Cloud-Strategie“ haben und viele mit innovativen Umsetzungen in der Öffentlichkeit glänzen. Auch Bitkom widmete einen großen Bereich der Halle 4 der Vorstellung diverser Cloud-Angebote hiesiger Unternehmen.

Daher wollte ich von den Herren wissen, ob die Cloud-Angebote von Microsoft auch für die andere Schicht der Wirtschaft, nämlich für die Start-Ups geeignet sei.

Cloud und die Start-Ups

Offensichtlich liegt das Thema Jean-Philippe Courtois am Herzen. Er erwähnte enthusiastisch die Microsoft BizSpark-Initiative (technische und finanzielle Unterstützung für die Start-ups, [2]) um gleich danach zu betonen, dass die Start-Ups von heute die perfekte Kunden für die Cloud-Angebote sind. Die Herausforderungen einer globalen IT können nur mit einer Anwendung basierend auf einer globalen IT-Infrastruktur bewältigt werden, kein Start-Up sei aber in der Lage diese Infrastruktur selbst bereit zu stellen. Klein anfangen und sehr schnell wachsen ist die Natur eines Start-Ups, in der IT-Welt ist dies aber nicht einfach realisierbar und zugleich mit signifikanten Investments verbunden. Hinzu kommt auch die Tatsache, dass die Start-Ups neu anfangen und in der Lage sind die neusten Entwicklungen zu nutzen. Bei größeren Unternehmen sind die sog. Legacy-Probleme, nämlich die Migration bestehender Strukturen und die Anbindung an diverse, teils veraltete Systeme eine der größten Herausforderungen. Alle diese Probleme sind bei einem Start-Up eben nicht vorhanden.

Microsoft versucht auch im Gegensatz zu Amazon und Google, zwei weiteren Cloud-Anbietern, auch die Aufgaben der Entwickler zu vereinfachen und mit vorgefertigten Applikationsbausteinen den Bau von Applikationen zu unterstützen. An der Kostenseite stehen auch seitens Microsoft neben Test-Accounts (die kräftig auf der CeBIT beworben wurden) auch diverse kostenlose Angebote für kleine Unternehmen.

Spannend war die Aussage, das von rund 35.000 Azure-Anwendungen rund ein Drittel von den Start-Ups entwickelt wurde und in den top 15 Applikationen auch einige Start-Ups vertreten sind.

Quo Vadis Microsoft?

Wenn wir schon dabei waren wollte ich wissen, ob die Cloud ein mit der Einführung des .NET Frameworks vergleichbar großer Schritt für die Entwickler darstellt.

Jean-Philippe bestätigte, dass die .NET Plattform die Herausforderungen der damaligen Zeit, nämlich der Übergang von monolitischen Desktop-Anwendungen hin zu vernetzten, Service-orientierten Anwendungen auf verschiedenen Gerätetypen ermöglichen sollte. Es hat Microsoft einige Jahre gekostet, die Vision hinter .NET in der realen Welt zu implementieren, aber heute sieht Microsoft diese Aufgabe als erfüllt an. Die .NET Plattform ist die Plattform der Wahl geworden und hat sich erfolgreich neben Java im Unternehmen und neben zahlreichen Web-Frameworks mit ASP.NET im Web etabliert.

Nun aber kommt eine nächste Herausforderung auf die Entwickler (und Microsoft) zu, die mit der Skalierung und fortschreitender Globalisierung zusammen hängt und bisherige Anforderungen bei weitem übersteigt. Und hier soll der Cloud-Ansatz helfen. Microsoft sieht aber hier nicht den nächsten getrennten Folgeschritt, vielmehr wird die bestehende .NET Plattform mit der Cloud erweitert – Windows Azure setzt auf bekannte Standards und wird von den gleichen Entwicklungstools unterstützt. Die Cloud seit eine logische Erweiterung der bisherigen .NET Plattform, die Entwickler bemächtigen soll neue Chancen zu nutzen.

Microsoft sei es sehr ernst in dieser Sache und die Investments in die Entwicklung der Plattform sollen es auch plausibel beweisen. Wenn man sich schon anschickt die Firma als die „Cloud Company“ zu bezeichnen, dann meint man es auch so. Dies soll sich in allen Angeboten wiederfinden – die zukünftige Microsoft-Strategie wird durch die Cloud geprägt und weiter geführt.

Er meinte in diesem Zusammenhang:
"Cloud Computing marks a major paradigm shift in the way companies and organizations access software and computing power. ICT creates cost and efficiency benefits which are available to organizations of all sizes, from the largest of enterprises to the smalles of start-ups, and even in the public sector in areas like health and education."

Zusammengefasst: die bessere Cloud


Die strategische Sicht: aus .NET wird .NET + Cloud geeignet für die kleinen und für die großen. Microsoft sieht die eigene Stärke in der einheitlichen Plattform, die sowohl die Anforderungen der IT-Pro Welt bedient als auch die Entwickler auf die nächste Stufe der Entwicklung bringt. Und dies, betonte Jean-Philippe am Ende, sei die bessere Cloud, die nicht nur die .NET Anwendungen unterstützt, vielmehr läuft auf der Azure Plattform eine Vielzahl an Programmiersprachen, darunter PHP, und Server-Anwendungen. Für jeden ist was dabei.

Nicht uneingenützig waren die Fragen, denn unser Investment in die Cloud-Version des AxCMS.net [3] wollte ich bestätigt bekommen. Und aufgrund des Gesprächs kann ich sagen .. die Zukunft der .NET Entwickler ist aus der Microsoft-Sicht offensichtlich in der Tat wolkig. :-)

[1] http://www.microsoft.com/germany/business/cloudservices/default.aspx
[2] http://msdn.microsoft.com/de-de/ff963029.aspx
[3] http://de.axcms.net/

Herzlichen Dank an Dorothea, Kay und Achim von Microsoft Deutschland für die Organisation des Treffens. Beste Grüße an Nicki ICE Wruck und Dr. Windows Martin Geuß sowie an das MSND Bus Team. :-)

verschiedene Pattern zur Objekt Instanziierung

02.03.2011 23:55:10 | Lars Schmitt

Viele von euch werden, an dieser Stelle diesmal nichts neues Lernen, doch leider musste ich erst heute wieder feststellen, dass selbst solche Grundlagen nicht jedem bekannt sind.

Im großen und ganzen, existieren 3 unterschiedliche Möglichkeiten ein Objekt zu Instanziieren. Wenn man diese verschiedenen Pattern mit bedacht einsetzt, kann eine Anwendung einiges an Geschwindigkeit zulegen. Denn machen wir uns nichts vor, egal wie gut die Anwendung ist, ein Benutzer wird manche Funktionen im Lebenszyklus eines Programmes nur sehr selten benutzen.

Anhand von einigen kurzen sehr stark vereinfachten Beispielen, möchte ich euch heute diese 3 Möglichkeiten vorstellen.

  • Lazy Loading (träges Laden)
  • Eager Loding (eifriges Laden)
  • Over-Eager Loading (über eifriges Laden)

Stellen wir uns vor, wir haben eine Anwendung mit einigen Objekten. Wenn wir jetzt alle Objekte beim Starten der Anwendung Instanziieren würden, dann würde der Startvorgang der Anwendung im Verhältnis gesehen, einfach viel zu lange dauern. Genau an dieser Stelle könnte uns dieses Pattern helfen.

 

Lazy Loading:

Ein Objekt wird nicht im Cache vorgehalten und erst zu dem Zeitpunkt wo dieses Objekt benötigt wird wird es Instanziiert.

   
public class Orders    
{        
    public int OrderID { get; set; }         
    private List<Detail> _orderDetails;        
    public List<Detail> OrderDetails        
    {            
        get    
        {                
            return _orderDetails ?? LoadDetailsForOrderID(orderID: OrderID);    
        }    
    }  

    //irgendwo im Programm dann der Zugriff auf die Details        
    public void GetOrder(int orderID)        
    {            
        Orders order = GetOrder(id: orderID);            
        //erst jetzt werden die OrderDetails initialisiert            
        order.OrderDetails.ForEach( ... );        
    }                 
}    

oder auch mittels des neuen Objektes Lazy<T> (.Net Framework 4)

   
public class Orders    
{    
    public int OrderID { get; set; }  

    public Lazy<List<Detail>> OrderDetails {get;set;}  

    //irgendwo im Programm dann der Zugriff auf die Details   
    public void GetOrder(int orderID)    
    {    
        Orders order = GetOrder(id: orderID);    
        //erst jetzt werden die OrderDetails initialisiert    
        order.OrderDetails.Value.ForEach((item) => item.ToString());    
    }    
}    

Verständlicherweise ergeben sich in unserer Anwendung, auch immer wieder verschiedene Situationen wo man als Entwickler sagen kann, wenn ein User dieses Objekt benutzt, wird er mit hoher Wahrscheinlichkeit auch ein anderes weiteres Objekt benötigen. Also können wir das schon einmal mittels der Eager Loading Instanziieren. Ich bekomme also ein Vollständiges Objekt und kann damit sofort Arbeiten.

Eager Loding:

   
public class Orders    
{        
    public Orders(int orderID)    
    {    
        _orderDetails = LoadDetailsForOrderID(orderID: orderID);    
    }  

    public int OrderID { get; set; }         
    private List<Detail> _orderDetails;        
    public List<Detail> OrderDetails        
    {            
        get    
        {                
            return _orderDetails;    
        }    
    }  

    //irgendwo im Programm dann der Zugriff auf die Details        
    public void GetOrder(int orderID)        
    {            
        Orders order = GetOrder(id: orderID);            
        //das Object ist schon lange vorhanden, denn die Instanziierung wurde im Konstruktor vorgenommen    
        order.OrderDetails.ForEach( ... );        
    }                 
}    

 

Over-Eager Loding:

Im Prinzip kann man dieses Pattern als eine Mischung aus den anderen beiden Sehen. Es wird erst einmal das Grundobjekt erzeugt, und zurückgegeben. Der Anwender kann also sofort mit der Order Arbeiten, sollte er sich irgendwann entschließen auf die Details zuzugreifen bekommt er diese, zumindest schon mal schneller als beim Eager Loading bestenfalls natürlich sofort.

Wie Funktioniert das ganze:

Das Geheimnis liegt in der Implementation, es wird zb durch die Instanziierung ein Hintergrundprozess angestoßen, der die OrderDetails beschafft.

   
public class Orders    
{        
    public Orders(int orderID)    
    {    
        Task.Factory.StartNew(() =>    
        {    
            _orderDetails = LoadDetailsForOrderID(orderID: orderID);    
        }    
    }  

    public int OrderID { get; set; }         
    private List<Detail> _orderDetails;        
    public List<Detail> OrderDetails        
    {            
        get    
        {                
            return _orderDetails;    
        }    
    }  

    //irgendwo im Programm dann der Zugriff auf die Details        
    public void GetOrder(int orderID)        
    {            
        Orders order = GetOrder(id: orderID);            
        //ob das Object schon vorhanden ist, weiß man nicht    
        order.OrderDetails.ForEach( ... );        
    }                 
}    

So sollte das natürlich nicht sein, denn sobald Threads oder Tasks mit ins Spiel kommen, darf man natürlich nicht auf ein anständiges Locking verzichten.

 

 

Fazit: Abschließend kann ich euch leider keine Empfehlung geben wie Ihr es am besten machen könnt, das hängt leider immer von der jeweiligen Domäne ab ich kann euch nur raten, nutzt und Experimentiert mit diesen Möglichkeiten, um für euch die passende Vorgehensweise zu entdecken.

Using WCF Web APIs / WCF Http with ASP.NET Forms Authentication

02.03.2011 20:34:02 | Alexander Zeitler

Since a while Microsoft is working on WCF to ease the usage in RESTful scenarios.

The new WCF HTTP APIs make hosting WCF services in (existing) ASP.NET (MVC) Websites easier without having the configuration overhead as before.

The current builds actually lack of simple authentication and authorization, but there are plans to support OAuth in the near future.

I’ve been asking myself, why not just using existing and reliable techniques like ASP.NET Forms Authentication.

After some attempts I have been able to get a (almost for my use cases) working solution running

Requirements

My authorization and authentication requirements are:

  • Role based Forms Authentication both for the ASP.NET MVC 3 website and the WCF HTTP services hosted inside
  • RESTful authentication should not parse or fill forms on a website but use forms authentication credentials against a WCF HTTP authentication service
  • Inside a browser RESTful services should return XML
  • Invoked from a console test client the RESTful services should return JSON

Implementing the service host

The solution is based on  WCF Web APIs Preview 3.

First we create an empty ASP.NET MVC 3 website.

XML is returned by the WCF HTTP APIs automatically if requested.

Die return JSON we need a so called JsonProcessor which is included in the APIs.

To be able to process the input from the form we need to use a FormUrlEncodedProcessor which also already exists.

This leads us to the following service configuration:

public class ContactManagerConfiguration : HttpHostConfiguration, IProcessorProvider {
	private readonly CompositionContainer _container;

	public ContactManagerConfiguration(CompositionContainer container) {
		_container = container;
	}

	public void RegisterRequestProcessorsForOperation(HttpOperationDescription operation, IList<Processor> processors, MediaTypeProcessorMode mode) {
		processors.Add(new JsonProcessor(operation,mode));
		processors.Add(new FormUrlEncodedProcessor(operation,mode));
	}

	public void RegisterResponseProcessorsForOperation(HttpOperationDescription operation, IList<Processor> processors, MediaTypeProcessorMode mode) {
		processors.Add(new JsonProcessor(operation,mode));
	}

	public object GetInstance(Type serviceType, InstanceContext instanceContext, Message message) {
		var contract = AttributedModelServices.GetContractName(serviceType);
		var identity = AttributedModelServices.GetTypeIdentity(serviceType);
		var definition = new ContractBasedImportDefinition(contract, identity, null, ImportCardinality.ExactlyOne, false,
			                                                false, CreationPolicy.NonShared);
		return _container.GetExports(definition).First().Value;
	}
}

We’ll create two services:

  • Contact Service, contained in the ContactResource class
  • Login Service, contained in the LoginResource class

The implementions will be shown later on.

Both services are registered inside Global.asax.cs

In order to register the so called ServiceRoutes an extension method AddServicesRoute<TServiceResourse>() has been introduced.

The registration is the following:

var catalog = new AssemblyCatalog(typeof(Global).Assembly);
var container = new CompositionContainer(catalog);
var configuration = new ContactManagerConfiguration(container);
RouteTable.Routes.AddServiceRoute<ContactResource>("contact", configuration);
RouteTable.Routes.AddServiceRoute<LoginResource>("login", configuration);

To be able to run WCF HTTP and normal MVC routes inside the same application, the WCF HTTP routes have to be filtered from the MVC routes which is done by an IRouteConstraint:

public class WcfRoutesConstraint : IRouteConstraint {
	public WcfRoutesConstraint(params string[] values) {
		this._values = values;
	}

	private string[] _values;

	public bool Match(HttpContextBase httpContext,
	Route route,
	string parameterName,
	RouteValueDictionary values,
	RouteDirection routeDirection) {
		// Get the value called "parameterName" from the
		// RouteValueDictionary called "value"
		string value = values[parameterName].ToString();

		// Return true is the list of allowed values contains
		// this value.
		bool match = !_values.Contains(value);
		return match;
	}
}

The WcfRouteConstraint is passed to the MapRoute definition:

routes.MapRoute(
	"Default", // Route name
	"{controller}/{action}/{id}", // URL with parameters
	new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
	new { controller = new WcfRoutesConstraint(new string[] {"contact","login"}) }
);

Die ContactResource looks as follows – to keep it simply without any database access etc.:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceContract]
[Export]
public class ContactResource {
	[ImportingConstructor]
	public ContactResource() {
			
	}
sieht wie folgt ausschnel
	[WebGet(UriTemplate="{id}")]
	public ContactDto Get(string id, HttpResponseMessage responseMessage) {
		var contact = new ContactDto
			            {
			              	Name = "Alexander Zeitler"
			            };
		return contact;
	}
}

The LoginResource looks as follows:

[ServiceContract]
[Export]
public class LoginResource {
	[ImportingConstructor]
	public LoginResource() {
			
	}

	[WebInvoke(UriTemplate="", Method = "POST")]
	public void Login(Credentials credentials, HttpResponseMessage responseMessage) {
		bool auth = Membership.ValidateUser(credentials.Username, credentials.Password);

		if (auth) {
			FormsAuthentication.SetAuthCookie(credentials.Username,true);
		}
		else {
			responseMessage.StatusCode = HttpStatusCode.Unauthorized;
		}
	}
}

The explanation is simple: Using an self implemented Credentials parameter having two properties Username and Password the login data is passed by a POST-method into the service.

The credentials are being authentication against the ASP.NET membership database (you’ll have to setup it using aspnet_regsql.exe).

When succeeding the ASP.NET FormsAuthentication cookie is returned.

When failing HTTP error 401 unauthoried is returned.

To get the ASP.NET FormsAuthentication working the web.config has to be modified.

First the URLs being protected have to be blocked for anonymous users.

The login service (not the web page here!) has to be visible to all users:

<location path="">
	<system.web>
		<authorization>
			<allow roles="Admins"/>
			<deny users="*"/>
		</authorization>
	</system.web>
</location>
<location path="login">
	<system.web>
		<authorization>
			<allow users="*"/>
		</authorization>
	</system.web>
</location>

This is the FormsAuthentication configuration required:

<authentication mode="Forms">
    <forms loginUrl="~/Account/LogOn" timeout="2880" name=".ASPXFORMSAUTH" />
</authentication>

The account controller looks as follows:

public class AccountController : Controller
{
	[HttpGet]
    public ActionResult Logon() {
		Response.StatusCode = (int)HttpStatusCode.Unauthorized;
        return View();
    }



	[HttpPost]
	public ActionResult Logon(string username, string password) {
		if(Membership.ValidateUser(username, password)) {
			FormsAuthentication.SetAuthCookie(username,true);
		}
		return View();
	}

	public ActionResult LogOff() {
		FormsAuthentication.SignOut();
		return RedirectToAction("Logon", "Account");
	}
}

The parameterless “Logon” Action is used to block anonymous calls from RESTful clients.

The POST version of “Logon” is used for FormsAuthentication inside a browser.

The “LogOff” Action should

Die LogOff Action should be self-explanatory…

The appropriate Logon-View consists of a form containing both Username and Password input fields, the submit button plus an ActionLink to the LogOff Action method.

Implementing the service client

The client has to functions:

  • Authentication
  • Reading the contact data when being authenticated

Authentication is done using the HttpWebRequest class:

HttpWebRequest loginRequest = (HttpWebRequest)HttpWebRequest.Create("http://localhost:44857/login");
loginRequest.Method = "POST";


CookieContainer cookieContainer = new CookieContainer();
loginRequest.CookieContainer = cookieContainer;
loginRequest.ContentType = "application/x-www-form-urlencoded";
ASCIIEncoding encoding = new ASCIIEncoding();
string postData = "Username=foo&Password=bar";
byte[] data = encoding.GetBytes(postData);

loginRequest.ContentLength = postData.Length;
Stream dataStream = loginRequest.GetRequestStream();
dataStream.Write(data, 0, data.Length);
dataStream.Close();

loginRequest.GetResponse();

It’s important to set the ContentType and using the CookieContainer.

The CookieContainer stores the received cookies from the server (servcice) after loginRequest.GetResponse() is called.

If authentication has been successful the contact data can be read from the contact service.

To pass the request to the protected contact service through the FormsAuthentication, the cookie being received before needs to be passed within the request which is done be re-using the CookieContainer:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost:44857/contact/1");
request.CookieContainer = cookieContainer;
request.Accept = "application/json";
request.Method = "GET";
try {
	HttpWebResponse response = (HttpWebResponse)request.GetResponse();
	Stream responseStream = response.GetResponseStream();
	StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
	string result = reader.ReadToEnd();
	JavaScriptSerializer jsonDeserializer = new JavaScriptSerializer();
	ContactDto contact = jsonDeserializer.Deserialize<ContactDto>(result);
	Console.WriteLine(contact.Name);
	Console.ReadLine();
}
catch (WebException e) {
	Console.WriteLine(((HttpWebResponse)e.Response).StatusCode);
	Console.ReadLine();
}

Calling the Website (http://localhost:44857/contact/1) after a successful login (http://localhost:44857/Account/Logon) returns the contacts XML definition:

XML

The console client will return the de-serialized JSON:

JSON

If authentication fails the “Unauthorized” status code will be returned:

Unauthorized

 

Please note that I've have posted an update of the client that uses the shiny new HttpClient.

Hence all requirements have been implemented.

As well as the early bits of the WCF HTTP APIs this solution doesn’t raise a claim of being complete or working perfectly and should be used as a basis for discussion.

You can download the sample implementation from here: WcfHttpMvcAuth.zip (9.45 mb)

DotNetKicks-DE Image

Einladung zum Treffen der .NET Usergroup Dresden am 17.03.2011

02.03.2011 20:10:00 | Martin Hey

Am 17.03.2011 wird das nächste Treffen der Usergroup stattfinden. Dieses Mal kommen wir so denke ich allen Teilnehmern von der Altstadt-Seite etwas entgegen, denn das Treffen findet bei Saxonia Systems statt und beginnt um 18:00 Uhr. Wie beim letzten Treffen mit großer Mehrheit beschlossen wurde, wollen wir dieses Mal ein Coding Dojo durchführen.

Damit alle einen groben Einblick haben, wohin die Reise geht, werde ich die Gelegenheit nutzen und zu Beginn anhand eines einfachen Beispiels die grundlegende Herangehensweise an testgetriebene Entwicklung erklären. Das Beispiel wird wohl jedem bekannt sein und daher können wir uns hier auf das Wie und nicht so sehr auf das Was konzentrieren. Im Anschluss daran werden wir zunächst eine einfache Kata gemeinsam durchführen und so das eben gelernte Vertiefen. Ich werde noch ein paar schwierigere Übungen mitbringen, so dass wir dann darunter eine aussuchen können, die wir bearbeiten.

Der Abend soll den Auftakt dazu geben, zukünftig ab und zu das ein oder andere Dojo durchzuführen. Wer sein eigenes Notebook mitbringen möchte, um selbst an der Lösung der Aufgaben zu arbeiten, ist herzlich dazu eingeladen. Das Dojo selbst wird an einem zentralen Notebook durchgeführt, so dass alle Beteiligten an den Gedanken von Driver und Copilote teilhaben können. Ich bin schon sehr gespannt auf diesen Abend.

Damit wir besser planen können, bitte ich alle potenziellen Teilnehmer um Eintragung in die Teilnehmerliste.

März Update : Visual Studio ALM Pivot

02.03.2011 17:13:01 | Christian Binder

Folgende Neue Inhalte sind nun auch im Visual Studio ALM Pivot verfügbar:

Agile
Scrum mit dem MSF für Agile Template Teil 1
Scrum mit dem MSF für Agile Template Teil 2
Scrum mit dem MSF für Agile Template Teil 3

Version Control
Team Foundation Server 2010 Version Control
Team Foundation Server 2010 Arbeiten mit Branches

Test
Einführung Visual Studio Lab Management 2010

Development
Visual Studio 2010 Productivity Power Tools

Extensibility
Visual Studio 2010 Productivity Power Tools

Team Explorer Everywhere
Heterogene Entwicklungsumgebungen mit Team Foundation Server 2010

Viel Spass

WCF Web APIs / WCF Http mit ASP.NET Forms Authentication verwenden

02.03.2011 16:09:00 | Alexander Zeitler

Seit einiger Zeit arbeitet Microsoft daran, WCF z.B. für die Verwendung in RESTful Szenarien zu vereinfachen.

Die neuen WCF Http APIs ermöglichen ein einfacheres Hosting der WCF-Services in (bestehenden) ASP.NET (MVC) Websites ohne den von WCF bisher bekannten Konfigurationsaufwand.

In den aktuellen Builds ist allerdings die Unterstützung für Authentifzierung und Authorisierung noch nicht wirklich vorhanden.

Geplant ist z.B. die Unterstützung von OAuth.

Allerdings habe ich mir die Frage gestellt, warum man nicht Bewährtes, wie z.B. die ASP.NET Forms Authentication wiederverwendet.

Nach einigen Versuchen bin ich für mich zu einer brauchbaren Lösung gekommen, die ich hier vorstellen möchte.

Requirements

Folgende Anforderungen habe ich an die Authentifizierung gestellt:

  • Forms Authentifizierung sowohl für die ASP.NET MVC 3 Website als auch für die darin gehosteten WCF Http Services
  • Die RESTful Authentifizierung soll keine Login-Formulare ausfüllen, sondern mit den Forms Authentication Credentials gegen einen WCF Http Authentication Service funktionieren
  • Im Browser sollen die RESTful Services XML liefern
  • An den Console Test Client sollen die RESTful Services JSON liefern

Umsetzung – Host

Die vorgestellte Lösung basiert auf den WCF Web APIs Preview 3.

Zunächst wird eine leere ASP.NET MVC 3 Website erstellt.

XML liefern die WCF Http APIs automatisch zurück.

Um JSON ausgeben zu können, wird ein sog. JsonProcessor benötigt, der bereits in den APIs enthalten ist.

Um Formulareingaben verarbeiten zu können, muss ein FormUrlEncodedProcessor verwendet werden, der ebenfalls bereits vorhanden ist.

Damit ergibt sich folgende Konfiguration für unsere Services:

public class ContactManagerConfiguration : HttpHostConfiguration, IProcessorProvider {
	private readonly CompositionContainer _container;

	public ContactManagerConfiguration(CompositionContainer container) {
		_container = container;
	}

	public void RegisterRequestProcessorsForOperation(HttpOperationDescription operation, IList<Processor> processors, MediaTypeProcessorMode mode) {
		processors.Add(new JsonProcessor(operation,mode));
		processors.Add(new FormUrlEncodedProcessor(operation,mode));
	}

	public void RegisterResponseProcessorsForOperation(HttpOperationDescription operation, IList<Processor> processors, MediaTypeProcessorMode mode) {
		processors.Add(new JsonProcessor(operation,mode));
	}

	public object GetInstance(Type serviceType, InstanceContext instanceContext, Message message) {
		var contract = AttributedModelServices.GetContractName(serviceType);
		var identity = AttributedModelServices.GetTypeIdentity(serviceType);
		var definition = new ContractBasedImportDefinition(contract, identity, null, ImportCardinality.ExactlyOne, false,
			                                                false, CreationPolicy.NonShared);
		return _container.GetExports(definition).First().Value;
	}
}

Wir erstellen zwei Services:

  • Contact Service, in der Klasse ContactResource
  • Login Service, in der Klasse LoginResource

Die Implementierungen werden weiter unten vorgestellt.

Die Registrierung der Services erfolgt in der Global.asax.cs

Für die Registrierung von sog. ServiceRoutes wurde eine Extension Method AddServiceRoute<TServiceResource>() eingeführt.

Die Registrierung sieht dann wie folgt aus:

var catalog = new AssemblyCatalog(typeof(Global).Assembly);
var container = new CompositionContainer(catalog);
var configuration = new ContactManagerConfiguration(container);
RouteTable.Routes.AddServiceRoute<ContactResource>("contact", configuration);
RouteTable.Routes.AddServiceRoute<LoginResource>("login", configuration);

Damit die ServiceRouten von WCF HTTP und die normalen MVC Routen parallel funktionieren,  müssen für die MVC-Routen die WCF HTTP Routen ausgefiltert werden, was mittels einer IRouteConstraint funktioniert:

public class WcfRoutesConstraint : IRouteConstraint {
	public WcfRoutesConstraint(params string[] values) {
		this._values = values;
	}

	private string[] _values;

	public bool Match(HttpContextBase httpContext,
	Route route,
	string parameterName,
	RouteValueDictionary values,
	RouteDirection routeDirection) {
		// Get the value called "parameterName" from the
		// RouteValueDictionary called "value"
		string value = values[parameterName].ToString();

		// Return true is the list of allowed values contains
		// this value.
		bool match = !_values.Contains(value);
		return match;
	}
}

Die WcfRouteConstraint wird in der MVC MapRoute-Definintion übergeben:

routes.MapRoute(
	"Default", // Route name
	"{controller}/{action}/{id}", // URL with parameters
	new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
	new { controller = new WcfRoutesConstraint(new string[] {"contact","login"}) }
);

Die ContactResource sieht wie folgt aus - der Einfachheit wegen ohne Datenbankzugriff o.ä.:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceContract]
[Export]
public class ContactResource {
	[ImportingConstructor]
	public ContactResource() {
			
	}

	[WebGet(UriTemplate="{id}")]
	public ContactDto Get(string id, HttpResponseMessage responseMessage) {
		var contact = new ContactDto
			            {
			              	Name = "Alexander Zeitler"
			            };
		return contact;
	}
}

Die LoginResource sieht wie folgt aus:

[ServiceContract]
[Export]
public class LoginResource {
	[ImportingConstructor]
	public LoginResource() {
			
	}

	[WebInvoke(UriTemplate="", Method = "POST")]
	public void Login(Credentials credentials, HttpResponseMessage responseMessage) {
		bool auth = Membership.ValidateUser(credentials.Username, credentials.Password);

		if (auth) {
			FormsAuthentication.SetAuthCookie(credentials.Username,true);
		}
		else {
			responseMessage.StatusCode = HttpStatusCode.Unauthorized;
		}
	}
}

Die Funktion ist schnell erklärt: Über einen selbst implementierten Credentials Parameter mit den Properties Username und Password kommen die Login-Daten des Users per POST-Methode in den Service.

Diese werden gegen die ASP.NET Membership Datenbank authentifiziert und im Erfolgsfall wird das ASP.NET FormsAuthentication Cookie zurückgeliefert.

Im Fehlerfall wird ein HTTP Error 401 Unauthorized  zurückgegeben.

Damit die ASP.NET FormsAuthentication funktioniert, sind  in der web.config einige Einstellungen vorzunehmen.

Zunächst müssen die zu schützenden URLs für die nicht authentifizierten User gesperrt werden.

Der Login-Service muss allen Usern zugänglich sein:

<location path="">
	<system.web>
		<authorization>
			<allow roles="Admins"/>
			<deny users="*"/>
		</authorization>
	</system.web>
</location>
<location path="login">
	<system.web>
		<authorization>
			<allow users="*"/>
		</authorization>
	</system.web>
</location>

Die FormsAuthentication wird wie folgt konfiguriert:

<authentication mode="Forms">
    <forms loginUrl="~/Account/LogOn" timeout="2880" name=".ASPXFORMSAUTH" />
</authentication>

Der Account-Controller sieht wie folgt aus:

public class AccountController : Controller
{
	[HttpGet]
    public ActionResult Logon() {
		Response.StatusCode = (int)HttpStatusCode.Unauthorized;
        return View();
    }



	[HttpPost]
	public ActionResult Logon(string username, string password) {
		if(Membership.ValidateUser(username, password)) {
			FormsAuthentication.SetAuthCookie(username,true);
		}
		return View();
	}

	public ActionResult LogOff() {
		FormsAuthentication.SignOut();
		return RedirectToAction("Logon", "Account");
	}
}

Die parameterlose Action "Logon" dient dazu, nichtauthentifizierte Aufrufe der RESTful Clients zu blocken.

Die Post-Variante dient für die normale Formular-Authentifizierung im Browser.

Die LogOff Action ist selbsterklärend…

Die zugehörige Logon-View besteht aus einem Formular mit den beiden Eingabefeldern Username und Password soweit einem Button und einem Link auf die Abmelde-Action.

Umsetzung Client

Der Client besteht aus zwei Funktionen:

  • Authentifzierung
  • Kontaktdaten lesen

Die Authentifzierung erfolgt mittels HttpWebRequest:

HttpWebRequest loginRequest = (HttpWebRequest)HttpWebRequest.Create("http://localhost:44857/login");
loginRequest.Method = "POST";


CookieContainer cookieContainer = new CookieContainer();
loginRequest.CookieContainer = cookieContainer;
loginRequest.ContentType = "application/x-www-form-urlencoded";
ASCIIEncoding encoding = new ASCIIEncoding();
string postData = "Username=foo&Password=bar";
byte[] data = encoding.GetBytes(postData);

loginRequest.ContentLength = postData.Length;
Stream dataStream = loginRequest.GetRequestStream();
dataStream.Write(data, 0, data.Length);
dataStream.Close();

loginRequest.GetResponse();

Wichtig ist das Setzen des ContentTypes sowie die Verwendung des CookieContainers.

Der CookieContainer speichert nach dem Aufruf von loginRequest.GetResponse() die vom Server erhaltenen Cookies.

Nach erfolgreicher Authentifizierung können die Daten vom Kontakt-Service geladen werden.

Damit die Formular-Authentifizerung die Requests an den geschützten Kontakt-Service weiterreicht, muss das oben erhaltene Cookie mit übergeben werden, was man durch die Wiederverwendung des CookieContainers erreicht:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost:44857/contact/1");
request.CookieContainer = cookieContainer;
request.Accept = "application/json";
request.Method = "GET";
try {
	HttpWebResponse response = (HttpWebResponse)request.GetResponse();
	Stream responseStream = response.GetResponseStream();
	StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
	string result = reader.ReadToEnd();
	JavaScriptSerializer jsonDeserializer = new JavaScriptSerializer();
	ContactDto contact = jsonDeserializer.Deserialize<ContactDto>(result);
	Console.WriteLine(contact.Name);
	Console.ReadLine();
}
catch (WebException e) {
	Console.WriteLine(((HttpWebResponse)e.Response).StatusCode);
	Console.ReadLine();
}

Der Aufruf im Browser liefert nach erfolgter Authentifizierung das gewünschte XML zurück:

XML

Der Client liefert das deserialisierte JSON zurück:

JSON

Bei erfolgloser oder fehlender Authentifizierung wird der entsprechende StatusCode zurückgeliefert:

Unauthorized

Bitte beachtet, dass ich ein Update gepostet habe, das den neuen HttpClient verwendet.

Damit sind die zu Beginn gestellten Forderungen implementiert.

Ebenso wie die in einem frühen Stadium vorliegenden WCF HTTP APIs erhebt diese Lösung keinen Anspruch auf vollständige Funktion und soll auch als Diskussionsgrundlage dienen.

Die Beispiel-Implementierung kann hier heruntergeladen werden: WcfHttpMvcAuth.zip (9.45 mb)

DotNetKicks-DE Image

Announcing SPFeed

01.03.2011 09:21:21 | Thorsten Hans

Analog zu den .NET German Bloggers gibt es nun auch einen zentralen Feed-Aggregator für SharePoint Blogs aus Deutschland, unter http://www.spfeed.de findet ihr eine Aggregation von deutschen SharePoint Blogs.

Da die SharePointFeed Seite erst gestern online ging, sind erst ein Bruchteil der deutschen SharePoint Blogs hier aufgenommen – Was sich natürlich schnellstens ändern soll.

bground

Was bietet mit SPFeed.de?

Wie bereits erwähnt bietet SPFeed.de eine zentrale Anlaufstelle für Menschen die mit SharePoint arbeiten, hierbei wird keinerlei Unterscheidung im Kontext gemacht, was bedeuten soll dass ihr dort sowohl

  • Developer
  • IT-Pro
  • InformationWorker

Content findet. Das Layout der Seite ist bewusst schlicht gehalten, damit das wesentliche, der Content, im Fokus ist. Über die integrierte Suche kann man schnell und bequem durch alle Posts der angemeldeten deutschen SharePoint Blogger suchen und findet somit direkt die gewünschten Informationen

Auch bei Twitter

Parallel zur Webseite werden auch sämtliche Posts nochmals bei Twitter über den Account SP_Feed gepublished.

 

Schreibst du über SharePoint?

Falls ja, dann kontaktiere mich, damit ich deinen Feed auf www.spfeed.de integrieren kann.

 

Technorati-Markierungen: ,,,
DotNetKicks-DE Image

WPF Forum | ASP.NET Forum | ASP.NET MVC Forum | Silverlight Forum | Windows Phone 7 Forum | SharePoint Forum | Dotnet Jobs | Dotnet Termine | Developer Blogs | Dotnet News

Das Team | Regeln | Impressum