Microsoft hat heute auf den TechDays in Belgien die lang erwartete ASP.NET MVC 4 Beta vorgestellt und auch öffentlich zum Download bereitgestellt.
Die für mich wichtigste Neuerung ist die Integration der bisherigen WCF Web API in den ASP.NET Stack.
Einer der Hauptgründe für die Zusammenführung der beiden Projekte war die bisher berechtigte Frage nach der Koexistenz von zwei Frameworks von Microsoft, die beide das Erstellen von ReSTful Services erlauben - namentlich das bereits vorhandene ASP.NET MVC sowie die eben erwähnte und zum damaligen Zeitpunkt neu entwickelte WCF Web API.
Somit kommen den ASP.NET MVC Entwicklern nun die bereits implementierten Goodies der WCF Web API zugute.
Alles neu macht…der ApiController
Wie sieht das Ganze nun in der Praxis aus?
Die wichtigste Änderung ist die Implementierung einer API (oder auch Services, je nach Sprachgebrauch):
Bisher implentierte man eine API folgendermaßen:
Mit der ASP.NET Web API geschieht dies nun etwas anders:
Wie man sieht, wird nun für die APIs ebenfalls ein Controller implementiert, der jedoch nicht von Controller erbt, sondern von ApiController. Es gibt auch keine gemeinsame Basisklasse mit Controller.
Wenn man das Beispiel ansieht, taucht natürlich sofort eine weitere Frage auf: woher “weiß” die ASP.NET Web API, welches die Methoden für GET, POST, PUT etc. sind?
Hier greift nun das von ASP.NET MVC bekannte Prinzip “Convention over Configuration”, d.h. das Naming der Methode in der Klasse der API bestimmt auch deren HTTP Methode.
Übrigens gilt Conventention over Configuration auch bei den Controllern: Die API-Controller müssen ebenfalls im Controller-Ordner von ASP.NET MVC liegen.
Convention over Configuration…aber
…ein wenig Konfiguration gibt es doch noch - wechseln wir deshalb zur Global.asax.cs. Konfiguriert wird die ASP.NET Web API nach wie vor dort.
Die einzige Option, die grundlegend nötig ist, ist die Zuweisung einer Route in den Route Tables zu den ApiControllern.
Auch hier gibt es eine positive Neuerung: ASP.NET Web API nutzt nun das ASP.NET MVC Routing, allerdings erfolgt die Route-Definition nicht über MapRoute, sondern über MapHttpRoute:
Der Unterschied zur Default-Route von MVC ist der, dass die Action nicht explizit in der URI vorkommt (hier greift die genannte Konvention).
Somit ist unsere CustomersApi unter
http://localhost/api/customers
verfügbar - GET /customers/id, PUT, POST etc. funktionieren analog.
Möchte ich nun z.B. mehrere Get-Methoden implementieren, kann ich das über das Routing leicht ändern, indem ich einfach die Action einfach wieder mit in die Route aufnehme:
Dependency Injection
Natürlich funktioniert auch weiterhin Dependency Injection, hier wieder am Beispiel von LightCore.
Geben und nehmen...
Natürlich sind nicht nur Neuerungen der WCF Web API in die ASP.NET Web API eingeflossen, sondern Web API profitiert auch von ASP.NET MVC Features, z.B. dem Model Binding und der Validierung.
Für die Validierung können die gewohnten Annotations wie [Required] etc. verwendet werden:
Um die Validierung ans Arbeiten zu bekommen, ist nun noch ein ActionFilter nötig:
Der ActionFilter validiert das Model, welches z.B. per POST gesendet wurde und erzeugt im Fehlerfall ein JSON-Objekt, welches die Auflistung der Fehler enthält. Diese werden mit einem HTTP Status Code 400 (Bad Request) zurück an den Client geschickt.
Auf der Client-Seite werten wir das Ganze mit jQuery im POST-Request aus:
Voraussetzung ist natürlich das Einbinden der jQuery unobstrusive Validation Scripts und das Setzen der Entsprechenden Attribute im HTML-Code:
Ebenfalls unterstützt ist nun FormsAuthentication, dies wird allerdings Gegenstand eines eigenen Blog Posts sein.
Hosting
Neben dem bekannten Hosting in IIS (Express) ist es auch möglich, Web API in einem eigenen Prozess zu hosten:
Damit SelfHost funktioniert, muß System.Web.Http.SelfHost referenziert sein.
Das soll es als kurzer Überblick von meiner Seite zunächst gewesen sein.
Currently rated 4.7 by 3 people
- Currently 4.666667/5 Stars.
- 1
- 2
- 3
- 4
- 5
Legacy Code Kata
Nachdem wir in den vergangenen Dojos immer auf der grünen Wiese angefangen haben, werden wir es in diesem Dojo mit einer existierenden Code Basis zu tun haben.
Wie so oft in der Realität, wird es auch hier die Aufgabe sein fremden Code zu erweitern. Trotzdem soll natürlich sicher gestellt sein, dass bestehende Funktionen immer noch wie erwartet funktionieren.
Ziel ist auch dieses mal wieder die Vertiefung der Fertigkeiten in der Zusammenarbeit als Team, Anwendung von TDD, Erkennen von Refactoring Patterns durch Babysteps und natürlich der Erfahrungsaustausch mit anderen Entwicklern.
Ansonsten gelten die üblichen Rahmenbedingungen:
- Lockere Atmosphäre
- Spaß am Coden
- Spaß mit gleichgesinnten Entwicklern haben
- Offen sein für Neues
- CleanCode
- TDD
- .NET oder auch jede andere Sprache (bitte Notebook mit entsprechender IDE mitbringen)
Das Mitbringen von Notebooks ist erwünscht, da wir uns in mehrere Teams aufteilen werden. Zumindest sollte eine Entwicklungsumgebung (Visual Studio, Eclipse, etc. ) installiert sein. Weitere Tools (NUnit, RhinoMocks, CodingDojoHelper, etc.) können wir dann gerne vor Ort verteilen.
Externe Tastaturen haben sich auch als sehr hilfreich erwiesen.
Anmeldung via XING.
Location:
DJK-Ost
Friedrichstaler Allee 52
76131 Karlsruhe
Beginn:
Di, 13.03.2012, 18:00
Currently rated 1.3 by 9 people
- Currently 1.333333/5 Stars.
- 1
- 2
- 3
- 4
- 5
In Single Page Applications verwendet man häufig Hash-Bang Urls (was das ist, hat Robert hier beschrieben).
Setzt man nun anstelle des üblichen HomeControllers, der die Startseite (üblicherweise die Index View) rendert, eine statische default.htm Datei ein, will man natürlich die Hash-Bang Urls möglichst elegant und wie z.B. von twitter gewohnt in diesem Stil darstellen:
http://meineseite/#!/machwas
Durch die Verwendung der default.htm mit aktiviertem Default-Controller, müßte man das ganze allerdings so darstellen:
http://meineseite/default.htm#!/machwas
Leider funktioniert
http://meineseite/#!/machwas
zunächst nicht mehr (es erscheint die Index-Seite des HomeControllers oder ein 404, falls man den HomeController bereits gelöscht hat).
Der Grund liegt in den Route-Definitionen, die per Default in der Global.asax.cs definiert sind, genauer in der Definition eines Default-Controllers:
Entfernt man die Definition des Default Controllers
funktioniert der Aufruf von
http://meineseite/#!/machwas
wie gewünscht.
Natürlich kann man auch die Index-View des HomeControllers als Startseite für eine Single Page Application verwenden, was ich persönlich aber nicht (mehr) mache.
Currently rated 1.6 by 39 people
- Currently 1.641026/5 Stars.
- 1
- 2
- 3
- 4
- 5
Am 26.01.2012 um 18:00 Uhr findet das nächste Treffen der .NET Usergroup Karlsruhe (XING-Gruppe der .NET Usergroup Karlsruhe) statt.
Thema
Know your Tools
Details zum Thema
Alternativen zu den klassischen Tools
Im Zentrum steht natürlich VisualStudio 2010
- was bringt VS 2012?
- welche Alternativen gibt es ?
- Add-Ons, die im Allgemeinen verwendet werden
- Zielplattformen, die mit .NET bedient werden können (WP7, iPhone, Android, Metro, Linux, OSX)
- UI-Technologien und Tools (WPF, Silverlight, Metro, GTK, Android, ...)
- Offene Diskussion, es besteht auch die Möglichkeit ,dass jeder seine Tools vorstellen kann
Über den Sprecher
Frank Pfattheicher, Alexander Zeiter und möglichst viele aus der Usergroup 
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/html/vereinsheim.html
Currently rated 2.6 by 7 people
- Currently 2.571429/5 Stars.
- 1
- 2
- 3
- 4
- 5
Auf dem 28th Chaos Communication Congress (28C3) wurde eine Sicherheitslücke veröffentlicht, die neben anderen Plattformen auch ASP.NET betrifft.
Betroffen sind ASP.NET-Seiten, die application/x-www-form-urlencoded oder multipart/form-data verarbeiten.
Weitere Details gibts im Blog-Post des Security Research & Defense Blogs von Microsoft.
Microsoft arbeitet bereits mit Hochdruck an einem Fix, der evtl. sogar außerhalb des monatlichen Update-Zyklus’ verteilt werden soll.
Currently rated 2.6 by 7 people
- Currently 2.571429/5 Stars.
- 1
- 2
- 3
- 4
- 5
Robert hat vor kurzem “Keep it simple! YAGNI!” mit Bezug auf das Posting “Keep your code simple!” von Daniel Lang gepostet.
Da ich immer mal wieder gefragt wurde, wie man die NHibernate ISession in ASP.NET MVC per Request verwenden kann, hier ein Auszug aus der Global.asax:
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new {controller = "Home", action = "Index", id = UrlParameter.Optional}
);
ControllerBuilder.Current.SetControllerFactory(
new LightCore.Integration.Web.Mvc.ControllerFactory(_container));
}
protected void Application_Start() {
AreaRegistration.RegisterAllAreas();
setupIoC();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
void setupIoC() {
Action<MappingConfiguration> mappingsConfig =
mappings => mappings.FluentMappings.AddFromAssemblyOf<ContactMap>();
var builder = new ContainerBuilder();
SessionFactory =
Fluently.Configure().Database(
MsSqlConfiguration.MsSql2005
.ConnectionString(
connectionString => connectionString
.FromConnectionStringWithKey("MvcNHibernate")))
.CurrentSessionContext("web") // für ISession per Request
.Mappings(mappingsConfig).BuildSessionFactory();
builder.Register<ISession>(c => SessionFactory.GetCurrentSession());
var container = builder.Build();
}
protected void Application_BeginRequest() {
CurrentSessionContext.Bind(SessionFactory.OpenSession());
}
protected void Application_EndRequest() {
CurrentSessionContext.Unbind(SessionFactory);
}
public static ISessionFactory SessionFactory { get; private set; }
Zunächst werden die Mappings gelesen und mittels FluentNHibernate eine SessionFactory erzeugt. Diese wird als Property verfügbar gemacht und in Application_BeginRequest wird eine ISession erzeugt bzw. Application_EndRequest zerstört.
Wenn die ISession innerhalb des Requests (z.B. in einem Controller) benötigt wird, wird sie per IoC-Container (in diesem Fall LightCore) von der SessionFactory angefordert und bereitgestellt.
Der Controller sieht dann wie folgt aus:
public class HomeController : Controller {
readonly ISession _session;
public HomeController(ISession session) {
_session = session;
}
public ActionResult Index() {
ViewBag.Message = "Welcome to ASP.NET MVC!";
var customers = _session.Query<Customer>();
return View(customers);
}
public ActionResult About() {
var contacts =_session.Query<Contact>();
return View(contacts);
}
}
Be the first to rate this post
- Currently 0/5 Stars.
- 1
- 2
- 3
- 4
- 5
Am 13.10.2011 um 18:00 Uhr findet das nächste Treffen der .NET Usergroup Karlsruhe (XING-Gruppe der .NET Usergroup Karlsruhe) statt.
Thema
PowerShell 3.. 2.. 1.. mit Thomas Krause
Details zum Thema
PowerShell - No slides, just demo/code
Basics, Entwickler-spezifisches und neues in Windows 8
PowerShell wird spaetestens mit Windows Server 8 ein zentraler Baustein
des Systems. Wir werfen einen Blick auf das, was mit PowerShell heute
fuer Administratoren und Entwickler moeglich und sinnvoll ist und
schauen uns an, was uns mit PowerShell vNext erwartet.
Über den Sprecher
Neben meinem Leben als Mainstream-Entwickler mit Mainstream-Programmiersprachen (ObjectPascal, C++, .NET/C#) war ich lange auch auf der 'dunklen Seite der Softwareentwicklung' unterwegs - Datenbankentwicklung (PL/SQL, T-SQL, SQL etc.). Mit der Zeit lenkte dies meine Aufmerksamkeit auf 'unsichtbare' Themen wie Backup, Troubleshooting, Konfiguration, Migration, Monitoring etc.
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/html/vereinsheim.html
Be the first to rate this post
- Currently 0/5 Stars.
- 1
- 2
- 3
- 4
- 5
Die Slides und Demos zum WCF Web API Round-Up vom 05.09.2011 bei der Online-Usergroup bzw. zu meinem Vortrag bei der .NET Usergroup Leipzig am 09.09.2011 können hier zusammengefasst heruntergeladen werden.

Slides / Demos.
Be the first to rate this post
- Currently 0/5 Stars.
- 1
- 2
- 3
- 4
- 5
Will man die Templates für KnockoutJS in externe Files auslagern, kann man das wie folgt tun:
<script id="addCustomerTemplate" type="text/html" src="templates/customer/add.html"></script>
<script id='displayCustomerTemplate' type='text/html' src="templates/customer/display.html"></script>
<script type="text/javascript">
ensureTemplates();
function ensureTemplates() {
var totalTemplates = $('script[type="text/html"]').length;
var readTemplates = 0;
$('script[type="text/html"]').each(function (idx, val) {
$.get($(val).attr('src'), function (tmpl) {
$(val).text(tmpl);
readTemplates++;
if (readTemplates == totalTemplates) {
ko.applyBindings(viewModel);
}
});
});
}
In den Templates selbst findet sich dann wieder normales HTML inkl. Color Coding und IntelliSense in VS.
Die Lösung basiert auf dem Posting von Ryan Niemeyer und dem Kommentar von “The Reverand”.
Be the first to rate this post
- Currently 0/5 Stars.
- 1
- 2
- 3
- 4
- 5
Die Slides zu meinen Vorträgen zu REST mit der WCF Web API bei der .NET Usergroup Karlsruhe und bei der Online Usergroup können hier heruntergeladen werden.
Der Demo-Code steckt in den Beispielen früherer WCF Web API Postings hier im Blog.

Currently rated 5.0 by 1 people
- Currently 5/5 Stars.
- 1
- 2
- 3
- 4
- 5