code it

Martins Tech Blog

Exam 70-523: Upgrade MCPD .NET Framework 3.5 Web Developer to MCPD .NET Framework 4 Web Developer

Letzte Woche war es so weit - ich wollte den MCPD für Web Development mit dem .NET Framework in der Version 3.5 auf den aktuellen Stand bringen. Der kürzeste Weg dafür ist ein Upgrade-Exam und es war mein erstes dieser Art. Ich hatte schon vorher von Kollegen gehört, dass Upgrade-Prüfungen etwas anders ablaufen als normale Prüfungen. Normalerweise hat man ja etwa 40 Fragen, die man beantwortet und hat man mehr als 700 von 1000 Punkten, hat man bestanden. Die Upgrade Prüfung war vom Grundsatz her ähnlich aufgebaut: Es gab 80 Fragen und mit mindestens 700 Punkten hat man bestanden. Problem dabei: Es gibt vier Blöcke zu je 20 Fragen, die einzeln bewertet werden und offenbar zählt das schlechteste Ergebnis dieser Teilbereiche als Gesamtbewertung.

Inhaltlich ging es dabei um die gleichen Themengebiete, die auch eine Rolle spielen, wenn man die zugrundeliegenden MCTS-Prüfungen absolviert - also WCF-Services, AJAX, jQuery, ASP.NET MVC 2. Für mich etwas überraschend war, dass auch ADO.NET noch eine Rolle spielte (Zugriff auf Tabellen mit SqlCommand, SqlDataReader und DataTable). Interessant fand ich, dass im WCF-Block eine MSMQ-Frage kam - hat man damit im Entwickleralltag doch eher weniger Berührungspunkte. Auch wenn man in der 3.5er MCPD-Prüfung schon einmal beweisen musste, dass man sich mit WebForms, Update-Panels, Verschlüsselung, Sicherung der Webanwendung usw. auskennt, so ist das auch hier noch mal ein Thema.

Schade fand ich, dass die MVC Fragen alle noch auf ASP.NET MVC 2 und nicht mit der Razor-Syntax waren und dass auf einige Inhalte gar nicht eingegangen wurde - ich denke hier zum Beispiel an Data Annotations.

Achso - das Ergebnis? Passed.

Nachlese zum gestrigen Treffen der .NET Usergroup Dresden

Gestern abend fand das erste Treffen der .NET Usergroup Dresden in diesem Jahr statt und erfreulicherweise waren auch sehr viele Teilnehmer mit dabei. Und das war auch nicht verwunderlich, denn wir hatten ein paar sehr spannende Themen. Sicher waren die beiden Vorträge nur ein kurzer Einblick und es bleibt jetzt für alle die Option, sich selbst auszuprobieren. Um den Einstieg wieder zu finden, nun noch die Slides zu den Vorträgen von Daniel und mir sowie die Weblinks zu den Beispielen, die ich gezeigt hab:

Reactive Framework

Zunächst das Beispiel mit Aufruf eines WebRequests unter Zuhilfenahme der Reactive Extensions:

var webRequest = WebRequest
    .Create("http://localhost/mysite?output=xml");

var observableRequest = Observable
    .FromAsyncPattern<WebResponse>(
        webRequest.BeginGetResponse, 
        webRequest.EndGetResponse);

Observable
.Timeout(observableRequest.Invoke(), 
    TimeSpan.FromMilliseconds(20000))
.ObserveOnDispatcher()
.Subscribe
(
 response =>
 {
  var responseStream = response.GetResponseStream();
  var reader = new StreamReader(responseStream, Encoding.UTF8);
  var responseText = reader.ReadToEnd();

  textBox1.Text = responseText;
 },
 exception =>
 {
  textBox1.Text = exception.Message;
 }
);

Die beiden anderen Beispiele waren aus dem Web (Asynchrone Funktionsaufrufe, Malen auf einem Canvas) und sind recht schnell nachgestellt.

WebMatrix und Razor

Viel Spaß beim selbst ausprobieren und ich bin gespannt auf Eure Erfahrungen.

Mach dir dein eigenes Build!

Unter der Überschrift Erstellen Sie Ihren eigenen Build ist in der aktuellen Ausgabe der dotnetpro (02/2011) ein Artikel von mir erschienen, in dem ich an zwei mit Absicht simpel gehaltenen Beispielen die Möglichkeit der Erweiterung des Build-Workflows mit Hilfe eigener Activities zeige. Deklarative Activities können komplexe Aufgaben gruppieren und ermöglichen so, diese mehrfach zu verwenden ohne den Wartungsaufwand in die Höhe zu treiben; Codeactivities geben die Möglichkeit, den Workflow mit Funktionen auszustatten, die es im Standard nicht gibt.

Einladung zum Treffen der .NET Usergroup Dresden am 19.01.2011

Die Mitglieder werden die Einladung schon in Ihrem Postfach entdeckt haben. Aber natürlich freuen wir uns auch immer wieder über neue Gesichter. Das erste Treffen der .NET Usergroup Dresden im Jahr 2011 findet am 19.01.2011 statt und es gibt gleich wieder zwei sehr interessante Themen.

Reactive Framework (Martin Hey)

In einer kurzen Einführung zeige ich, was es damit auf sich hat, was das Grundkonzept ist und wie man einen Einsteig findet. Im Anschluss daran geht es ans coden - in ein paar Beispielen erfahren wir dann gemeinsam, ob und wie man seinen Code damit verständlicher, robuster und einfacher lesbar machen kann.

WebMatrix und die Razor-Syntax (Daniel Grund)

Gleich zwei spannende Themengebiete reißt Daniel an. Anlässlich des offiziellen Releases von WebMatrix am 13.01.2011 schauen wir uns gemeinsam an, was es damit auf sich hat. In diesem Zusammenhang gibt es auch einen kleinen Exkurs in die Razor Syntax, die Mitte 2010 das erste Mal vorgestellt wurde.

Eine Anmeldemöglichkeit und nähere Details zum Treffen findet ihr an gewohnter Stelle.

Datenbankrollen eines Benutzers ermitteln

Möchte man ermitteln, welchen Datenbankrollen ein Benutzer angehört, so ist es anfänglich gar nicht so kompliziert. Die relevante Systemsicht ist recht schnell gefunden: sys.database_role_members.

SELECT USER_NAME(role_principal_id)
FROM sys.database_role_members
WHERE member_principal_id = USER_ID('MyUser')

Hierbei gibt es aber zwei Probleme: Zunächst ist die Rolle public nicht enthalten und die Rekursion wird nicht aufgelöst, können doch Datenbankrollen andere Datenbankrollen enthalten. Eine Lösung dafür ist die Verwendung von Common Table Expressions, um die Rekursion aufzulösen. Ausformuliert sieht das in etwa wie folgt aus:

DECLARE @username sysname;
SET @username = 'MyUser';

WITH CTE_Roles (role_principal_id)
AS
(
SELECT role_principal_id
FROM sys.database_role_members
WHERE member_principal_id = USER_ID(@username)
UNION ALL
SELECT dbrm.role_principal_id
FROM sys.database_role_members dbrm
INNER JOIN CTE_Roles CR
 ON dbrm.member_principal_id = CR.role_principal_id
)
SELECT USER_NAME(role_principal_id) RoleName
FROM CTE_Roles
UNION ALL
SELECT 'public'
FROM sys.sysusers
WHERE uid = USER_ID(@username)
ORDER BY RoleName;

Aufgelistet werden alle zugeordneten Datenbankrollen unter Beachtung der Schachtelungsmöglichkeit von Rollen sowie die Rolle public.