Tags: , | Categories: Deutsch Posted by AlexanderZeitler on 2/16/2012 11:49 AM | Comments (0)

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
Tags: , | Categories: Deutsch Posted by AlexanderZeitler on 2/13/2012 11:47 PM | Comments (3)

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
Tags: | Categories: Deutsch, Deutsch Posted by AlexanderZeitler on 2/4/2012 1:37 PM | Comments (0)

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
Tags: , , | Categories: Deutsch, Deutsch Posted by AlexanderZeitler on 1/23/2012 4:08 PM | Comments (0)

.NET Usergroup Karlsruhe Logo

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 Winking smile

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
Tags: , | Categories: Deutsch Posted by AlexanderZeitler on 12/28/2011 3:31 PM | Comments (0)

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
Tags: , | Categories: Deutsch Posted by AlexanderZeitler on 11/7/2011 12:15 PM | Comments (2)

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);
	}
}
DotNetKicks-DE Image

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: , , | Categories: Deutsch Posted by AlexanderZeitler on 9/30/2011 12:41 PM | Comments (0)

.NET Usergroup Karlsruhe Logo

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

DotNetKicks-DE Image

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: , | Categories: Deutsch Posted by AlexanderZeitler on 9/14/2011 11:07 PM | Comments (0)

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.

WcfWebApi

Slides / Demos.

DotNetKicks-DE Image

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: | Categories: Deutsch Posted by AlexanderZeitler on 9/7/2011 10:50 PM | Comments (0)

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”.

DotNetKicks-DE Image

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: , | Categories: Deutsch, REST Posted by AlexanderZeitler on 7/4/2011 9:48 PM | Comments (0)

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.

WcfWebApi

DotNetKicks-DE Image

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5