Sven Hubert: Neu in VS 2015 – Gründe für den Umstieg auf .NET Core

Norbert Eder: C# 6: nameof Expression

nameof ist eine richtig hilfreiche Sache um all diese magischen Strings aus dem Sourcecode raus zu bekommen. Gerade zu WPF-Zeiten waren entsprechende Workarounds besonders in Zusammenhang mit INotifyPropertyChanged etc. gefragt. Hier ein solches Beispiel:

public class Person : INotifyPropertyChanged
{
    private string firstName;

    public string FirstName
    {
        get { return firstName; }
        set
        {
            firstName = value;
            NotifyPropertyChanged("FirstName");
        }
    }

    protected void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this,
                new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Der Nachteil besteht nun darin, dass bei einer Änderung der Property auch der String entsprechend geändert werden muss, damit die Funktionalität erhalten bleibt. Dies ist zwar in diesem Beispiel einfach zu finden, geht aber schon einmal unter.

NotifyPropertyChanged("FirstName"); kann nun wie folgt verbessert werden:

NotifyPropertyChanged(nameof(FirstName);

Dadurch werden Umbennungen auch hierfür durchgeführt.

Besonders interessant ist nameof auch bei der Verwendung der ArgumentNullException bzw. der ArgumentOutOfRangeException.

Zu beachten ist, dass nameof nur den eigentlichen Namen der Klasse, Methode oder Eigenschaft zurückliefert. Namespaces und übergeordnete Typnamen bleiben außen vor.

The post C# 6: nameof Expression appeared first on Norbert Eder.

Sven Hubert: Neu in TFS 2015 – Das Build-System

Manfred Steyer: Online-Artikel-Serie zu Security für Web-Sites und APIs in ASP.NET MVC 6

Da ASP.NET MVC 6 nicht nur der Nachfolger von MVC 5 sondern auch von ASP.NET Web API ist, stellt sich die Frage, wie Entwickler die damit entwickelten Services absichern können. Als Antwort findet man derzeit im GitHub Repository des Projektteams Middleware-Komponenten für Token-basierte Verfahren sowie Basisklassen für eigene Middleware-Komponenten.

Infos dazu findet man in meinen Online-Artikeln bei entwickler.de:

Authentifizierungsszenarien mit ASP.NET Identity ASP.NET 5
https://entwickler.de/online/asp-net-identity-159813.html

Sichere Web-APIs: Servicesecurity bei ASP.NET MVC 6
https://entwickler.de/online/asp-net-web-apis-165823.html

Florian Geisenhof: Sysinternals ohne Installation aus dem Explorer starten

Es ist möglich Sysinternals direkt aus dem Explorer zu starten, ohne Sysinternals heruntergeladen zu haben. Der Vorteil dieser Variante ist, dass immer die aktuellste Version der Sysinternal-Tools verfügbar ist. Um die Tools aufzurufen muss einfach in der Adresszeile des Explorers folgende Adresse eingegeben werden. \\live.sysinternals.com Nach kurzer Wartezeit erscheinen mehrere Ordner. Im Ordner […]

Holger Schwichtenberg: Visual Studio 2015 Enterprise noch bis 27. August vergünstigt

Mit einem Upgrade-Trick können Kunden die Enterprise-Editon von Visual Studio 2015 günstiger erwerben.

Holger Schwichtenberg: Microsoft veröffentlicht Beta 6 von Entity Framework 7

Die Verschiebung von .NET Core 5 und ASP.NET 5 gibt auch dem Entity Framework 7 mehr Zeit, sodass Microsoft von den angekündigten Einschränkungen nun teilweise wieder abrückt.

Sven Hubert: Neu in TFS 2015 – Cross Plattform Apps entwickeln

Marco Scheel: Links for 2015-07-27 [del.icio.us]

Dmitrij Doberstein: Add an existing Android Studio project to GitHub

At first we should enable the Version Control Integration in our project by pressing "VCS -> Enable Version Control Integration"



In the popup select Git for the version control system and click OK


Now right click on the project and select Git >>> + Add


And then Git >>> Commit Directory


 or VCS >>> Commit Changes


In this popup set Commit Message and click Commit


In the next step we will push the changes. For this select VCS >>> Git >>> Push


and we will see next popup


Here click on "Define remote" and enter URL of the GitHub repository and click OK.


Now we will see above popup with data... And click Push...


As result we will we  next error on the right top >>> Push rejected


This error is caused, because our repository contains files and we must pull this file as first. Also select VCS >>> Git >>> Pull


In the next popup click on Refresh button (1) then select Branches to merge (2) and click Pull (3).


And now we can repeat Push (VCS >>> Git >>> Push)...


Ready!!!

codefest.at [MS]: Wir bauen eine Windows 10 “Hosted Web App” (Project Westminster)

Viele Unternehmen wählen heutzutage als mobile Strategie einen "Mobile Web"- Ansatz.
Die Vorteile eines solchen liegen auf der Hand: dazu gehören u.a. die Unabhängigkeit von Stores, leichtere und schnellere Update-Möglichkeiten uvm. Mit Windows 10, der Universal Windows Platform und den dazugehörigen Universal Windows Platform Bridges bietet Microsoft nun eine Möglichkeit, die für Unternehmen mit einem "Mobile Web"- Ansatz mit Sicherheit interessant ist.: Project Westminster.

Vor einigen Wochen hat Rina bereits erste Informationen dazu gepostet und nun hat unser deutscher Kollege Patric Boscolo (MSFT)eine Schritt-für-Schritt Anleitung publiziert, mit deren Hilfe man eine erste “Hosted Web App” erstellen kann.

Viel Spaß beim Programmieren…

Sven Hubert: Neu in TFS 2015 – Welche Features Microsoft uns bring und Start der Blog-Serie

Marco Scheel: Links for 2015-07-26 [del.icio.us]

Johnny Graber: Neues in .Net

Im Schlepptau der Veröffentlichung von Visual Studio 2015 gibt es zahlreiche Neuigkeiten rund um .Net. Bei all den Versionen und Ankündigungen verliert man jedoch schnell den Überblick und alleine die Videos vom “Final Release Event” kommen zusammen auf fast 5 Stunden Demos und Erklärungen. Damit man ein wenig gezielter nach Neuigkeiten suchen kann, habe ich hier eine kleine Auslegeordnung der für mich wichtigsten Punkte vorgenommen.

 

.Net 4.6 und C# 6

Das .Net Framework wird kräftig weiterentwickelt und bietet mit Roslyn ganz neue Möglichkeiten zur Codeanalyse. Im Moment hört sich in diesem Bereich noch vieles nach einer netten Spielerei an. Richtig angewendet dürfen wir uns auf eine ganz neue Generation von Analysewerkzeugen freuen, die weit über Dinge wie die Null-Check Warnhinweise von ReSharper hinausgehen.

Für Entwickler wohl am deutlichsten spürbar ist der neue Null-Conditional Operator, der einem zahlreiche mühsame Null-Kontrollen erspart. Ob die Variablen customers oder Orders auf dieser Zeile Null sind spielt keine Rolle, der Code wird ausgeführt und liefert das gewünschte Ergebnis:

int? first = customers?[0].Orders?.Count();

Weitere Neuerungen wie die Filter bei Exceptions muss ich erst selber ausprobieren. Hat man jahrelang ohne diese Funktion programmiert fällt es einem oft schwer den Nutzen zu erkennen. Dies dürfte sich je nach Anwendungsfall aber schnell ändern, von dem her sollte man damit erst ein wenig herumexperimentieren bevor man ein Urteil fällt.

 

ASP.NET 4.6 ist nicht vNext

Im letzten Jahr war bei ASP.NET vor allem die Rede von vNext. Diese Neuentwicklung bricht mit dem bisherigen ASP.NET und hat als eines der auffälligsten Merkmale die project.json Datei. Zwischenzeitlich wurde vNext in ASP.NET 5 umbenannt. Damit es aber richtig kompliziert wird nennt man die Verschmelzung von ASP.NET MVC und Web API nun ASP.NET MVC 6. Dies da ASP.NET MVC 5 ja bereits im Oktober 2013 mit Visual Studio 2013 erschienen ist.

ASP.NET vNext resp. 5 ist noch in der Entwicklung und dürfte nach aktueller Roadmap erst im 1. Quartal 2016 erscheinen. Somit bleibt noch ein wenig Zeit bis man sich in ein grundlegend neues Framework einarbeiten muss.

Das jetzt veröffentlichte ASP.NET 4.6 enthält vor allem Optimierungen und Detailverbesserungen für die aktuellen Versionen von MVC, Web Forms und Web API. Damit findet man sich schnell zurecht, da die grossen Änderungen ja erst 2016 kommen. Dennoch lohnt sich ein Update, denn die verbesserte Unterstützung von IntelliSense für Bootstrap und AngularJS spürt man deutlich.

 

Änderungen an den Visual Studio Versionen

Die Premium und die Ultimate Version von Visual Studio 2013 wurden bei 2015 in der Enterprise Version kombiniert. Dementsprechend müssen sich bisherige Besitzer der Premium Version bei der nächsten Vertragserneuerung auf höhere Lizenzkosten gefasst machen.

Am unteren Ende der Versionspalette befindet sich die Visual Studio Community Edition, die gerade für kleinere Teams und Firmen mit weniger als 250 PCs oder 1 Million $ Jahresumsatz eine interessante Alternative darstellt. Entgegen der bekannten Express-Edition kann man hier die IDE erweitern und beispielsweise auch ReSharper verwenden.

Welche Version man nun mit welchen Funktionen erhält findet man auf der Übersichtseite von Microsoft.

 

Fazit

Diese Woche bringt für.Net Entwickler viel Neues. Leider erschwert der nicht gerade übersichtliche Mix aus 4.6, 5 und 6er Versionen das Zurechtfinden. Diese Verwirrung dürfte sich aber bald legen und mit ein wenig produktiver Erfahrung wird man die neuen Möglichkeiten von C# auch besser einordnen können. Angesichts von ASP.NET 5 wird es auch im 2016 spannend bleiben…


Einsortiert unter:.Net, dnugBern Tagged: .Net, C#, VisualStudio

Manfred Steyer: Online-Artikel-Serie zu Web APIs mit ASP.NET MVC 6

Mit ASP.NET 5 und .NET Core will Microsoft eine neue Ära von .NET einläuten. Das Framework soll modularer sowie plattformunabhängig werden. Außerdem sollen verschiedene Versionen künftig einfacher nebeneinander auf einem Server betrieben werden können. Da dieser nach über zwölf Jahren durchgeführte Frühjahrsputz ohnehin Breaking Changes notwendig macht, nutzt Microsoft die Gelegenheit, Mehrgleisigkeiten zu entfernen. Dazu gehört die Tatsache, dass in den letzten Jahren mit ASP.NET MVC und ASP.NET Web API zwei sehr ähnliche Frameworks nebeneinander existierten. Während der Fokus bei MVC auf Webanwendungen und bei Web-API auf HTTP-basierten Services – so genannten Web-APIs – lag, teilten sie viele zum Teil nur geringfügig anders implementierte Konzepte, wie Controller, Model, Model Binding oder Routing.

Infos dazu findet man in meinen Online-Artikeln bei entwickler.de:

Web-APIs mit ASP.NET MVC 6, Teil 1: Grundlagen
https://entwickler.de/online/web-apis-mit-asp-net-mvc-6-160060.html

Web APIs mit ASP.NET MVC 6, Teil 2: Unter der Motorhaube
https://entwickler.de/online/web-apis-mit-asp-net-mvc-6-2-160327.html

Marco Scheel: Links for 2015-07-24 [del.icio.us]

Martin Hey: SSLPeerUnverifiedException in Verbindung mit Android und IIS8

Das Backend für meine App sollt nur über eine https-Verbindung erreichbar sein. Alles kein Problem dachte ich mir, schnell ein SSL-Zertifikat besorgt und dieses der https-Bindung der Webanwendung zugewiesen. Alles kein Problem und auch der Browser zeigt das kleine grüne Schloss an und der Zertifizierungspfad war ok.


Um so überraschter war ich, dass meine Android App nun jeden Request mit einer Exception quittierte: 
javax.net.ssl.SSLPeerUnverifiedException (SSL peer not authenticated)

Laut Dokumentation passiert das, wenn man ein selbst signiertes Zertifikat verwendet und die Tipps im Web sind sehr breit gestreut - unter anderem "stelle den HttpClient doch so ein, dass er allen Zertifikaten vertraut". Das hilft bei selbst signierten Zertifikaten für eine Demo sicher, für eine echte App mit Kundendaten verwende ich diesen Tipp lieber nicht.

Was war nun aber Ursache für das Problem? Ich hatte im IIS in der https-Bindung den Haken bei "Require Server Name Indication (SNI)" gesetzt. Diese Einstellung sorgt eigentlich dafür, dass sich mehrere verschlüsselt abrufbare Websites unterschiedlicher Domains einen Server mit nur einer IP Adresse teilen können. Allerdings können ältere Browser damit Probleme haben. Offenbar zählt der HttpClient in Android / Java dazu, denn kaum hatte ich den Haken entfernt, ließ sich problemlos auf meine REST-API über HTTPS zugreifen.

Holger Sirtl: Azure News on Friday (KW30/15)

Auch diese Woche gab’s wieder viele Nachrichten zur Microsoft Azure Plattform. Hier sind nähere Infos dazu…

Aktuelle Neuigkeiten

Datum Nachricht
22.07. Azure Data Factory Visual Studio Extension for authoring pipelines
Visual Studio Extension für die Azure Data Factory ist allgemein verfügbar - Daten-Workflows in VS editieren
22.07. Introducing pen remoting for Windows 10 and Windows Server 2016
Unter Windows 10 wird die Möglichkeit zur Stifteingabe in Remote Desktop Sessions nochmals vereinfacht.
22.07. Announcing general availability of premium encoding
Premium Encoding in Azure Media Services sind ab sofort allgemein verfügbar.
22.07. Azure Search – New regions, samples and datasets
Azure Search ist jetzt in weiteren Regionen (Australien, Japan, Brasilien) verfügbar.
22.07. SQL Server 2016 Upgrade Advisor Preview and CTP 2.2 now available
Umstieg von einer früheren Version auf SQL Server 2016 geplant? Preview des SQL Server 2016 Upgrade Advisors
22.07. Using the Enterprise Mobility Suite to Protect Your Organization with Identity-driven Security
Absicherung von Unternehmens-Ressourcen mit Hilfe der Enterprise Mobility Suite und deren Möglichkeit zur Verwaltung mobiler Geräte.
22.07. Monitoring and Exploring your Visual Studio Online Work Items with Power BI
Visual Studio Work Items mit PowerBI visualisieren und auswerten.
22.07. Microsoft and Particle make connected devices simple with new Azure integration
Kooperation von Microsoft und Particle.IO: IoT Szenarien mit Particle-Tools, Event Hub, Stream Analytics etc.
22.07. Microsoft Advanced Threat Analytics coming next month
Infos zu Microsoft Advanced Threat Analytics (ATA) und dessen Möglichkeiten zur Analyse von Bedrohungsszenarien.
21.07. Power BI - GA and beyond...
Letzte Vorbereitungen und Aktivitäten vor der allgemeinen Verfügbarkeit von Power BI.
21.07. Power BI Weekly Service Update
Neuerungen in Power BI: Team Zusammenarbeit, Aktualisierung von Datenquellen gleichen Namens etc.
21.07. Leveraging the OMS Search API in an Azure Automation Runbook
Überwachung eines Accounts via Operations Management Suite (OMS) Search API in einem Azure Automation Runbook.
21.07. Every developer can now build their career with Azure Vidyapeeth
Mit Azure Vidyapeeth gibt es nun ein neues Trainingsangebot für alle Azure-Interessierten: Videos, MVA, Webinare etc.
21.07. Microsoft Passport and Azure AD: Eliminating passwords one device at a time!
Windows 10, Microsoft Passport und Azure AD schicken sich an Passwort-Eingaben in Zukunft bei steigender Sicherheit überflüssig zu machen.
21.07. Tuesdays with Corey: Linux Announcements and MOAR ARM
Corey Sanders fasst alle Ankündigungen der letzten Tage zu Linux auf Azure zusammen
20.07. Released Today: Visual Studio 2015, ASP.NET 4.6, ASP.NET 5 & EF 7 Previews
Release-Feuerwerk: Visual Studio 2015, ASP.NET 4.6, ASP.NET 5 & EF 7 Previews und das neue Azure SDK for .NET 2.7
20.07. Announcing the Azure SDK 2.7 for .NET
Neben dem Launch von Visual Studio 2015 fast untergegangen: das neue Azure SDK 2.7 für .NET ist da!
20.07. Application Insights Tools in Visual Studio 2015 RTM
Wie geht's meiner Anwendung? Detaillierte Informationen via Azure Application Insights und Visual Studio

Norbert Eder: C# 6: Auto-Property Initializers

In C# 3 wurden die Auto-Implemented Properties eingeführt. Auf Deutsch besitzen sie den wohlklingenden Namen Automatisch implementierte Eigenschaften. Sie werden so definiert:

public DateTime CreateDate { get; set; }

Dabei erstellt der Compiler im Hintergrund ein „unsichtbares“ Attribut, welches einen etwaigen Wert enhält. Nun ist es aber unpraktisch, einer derartigen Eigenschaft einen Default-Wert zu verpassen:

public DateTime CreateDate { get; set; }

public Address()
{
    CreateDate = DateTime.Now;
}

Mit C# 6 kann ein Default-Wert auch folgendermaßen gesetzt werden:

public DateTime CreateDate { get; set; } = DateTime.Now;

Das sieht schon mal ganz gut aus, funktioniert aber auch, wenn nur ein Getter vorhanden ist, der Wert also nicht verändert werden können soll (immutable):

public DateTime CreateDate { get; } = DateTime.Now;

In diesem Falle kann CreateDate nicht verändert werden (außer im Konstruktor).

Viel Spaß!

The post C# 6: Auto-Property Initializers appeared first on Norbert Eder.

Jürgen Gutsch: ASP.NET 5 Middlewares im Detail

Wie im ersten Beitrag erwähnt, implementiert ASP.NET 5 die OWIN Spezifikation und ist somit dem Projekt Katana recht ähnlich und übernimmt auch einige der Konzepte. So auch das Konzept der Middlewares, die sich in die Request- und Response-Pipeline hängen können.

Middleware

Die eingehängten Middlewares sind verkettet. Jede Middleware kennt die nächste und ruft diese auf.

Middlewares lassen sich mit HttpModulen aus der klassischen ASP.NET Welt vergleichen, der unterschied ist jedoch, dass die Reihenfolge fest vorgegeben ist und dass sich die Middlewares selber nacheinander aufrufen.

Eigene Middleware

Middlewares werden in der Startup.cs in der Methode Configure über den IApplicationBuilder angehängt. In einem neuen Projekt über ein Visual Studio Template sind schon einige Middlewares angehängt. So auch in unserer Startup.cs, allerdings in Form einer Extension-Methode auf dem IApplicationBuilder, was die Lesbarkeit etwas erhöht:

app.UseStaticFiles();
app.UseWelcomePage();

Die beiden Extensein-Methoden fügen die Middlewares für statische Dateien und für die Welcome-Page an.

Die einfachste Art Middleware ist die in Form einer Lambda-Expression. Dafür wird die Methode Use des IApplicationBuilder verwendet:

app.Use(next => async context =>
{
    // do something before the next MiddleWare starts

    await next.Invoke(context);

    // do something after the next MiddleWare started
});

Was wir hier sehen ist eine doppelte Lambda. Use() erwartet eine Func die ein RequestDelegate bekommt und eines zurück gibt. Ausgeschrieben sähe das in etwa so aus:

app.Use(FuncDelegate);

//[…]

private RequestDelegate FuncDelegate(RequestDelegate next)
{
    return async context =>
    {
        // do something before the next MiddleWare starts

        await next.Invoke(context);

        // do something after the next MiddleWare started
    };
}

Die Reihenfolge in der die Middlewares ausgeführt werden ist die Reihenfolge, in der die Middlewares eingebunden werden.

Diese Schreibweise ist perfekt für kleine Aktionen, oder zum debuggen. Würde man allerdings alle Middlewares auf diese Art schreiben, würde die Startup.cs relativ schnell sehr unübersichtlich werden. Vor allem bei Middlewares die recht aufwendig sind. Spätestens dann, sollte man größere Middlewares als eigene Klasse anlegen.

public class MyMiddleware
{
    private readonly RequestDelegate _next;
   
    public MyMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        // do something before the next MiddleWare starts

        await _next.Invoke(context);

        // do something after the next MiddleWare started
    }
}

Hier können wir nun alles Mögliche machen, indem wir auf den Context zugreifen und diesen Auswerten.

Beispiel:

Als Beispiel für eine etwas komplexere Middleware, möchte ich hier eine Logging-Middleware zeigen, die interessante Request-Informationen auf der Konsole ausgibt:

public class LoggingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger _logger;

    public LoggingMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)
    {
        _next = next;
        _logger = loggerFactory.CreateLogger("ExtendedLogging");
    }

    public async Task Invoke(HttpContext context)
    {
        _logger.LogInformation("{0} - {1} - {2}",
            context.Request.Method,
            context.Request.Path,
            context.Request.QueryString.Value);

        await _next.Invoke(context);
    }
}

public static class LoggingMiddleWareExtension
{
    public static void UseExtededLogging(this IApplicationBuilder app)
    {
        app.UseMiddleware<LoggingMiddleware>();
    }
}

In der Program.cs müssen wir die Middleware nun noch einbinden:

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(); 
     
    loggerFactory.MinimumLevel = LogLevel.Verbose;
    app.UseExtededLogging();
 
    app.UseStaticFiles();
    app.UseWelcomePage();
}

In der Konsole werden nun die Informationen ausgegeben, die wir in der Middleware gesammelt haben:

image

Was passiert, wenn man die nächste Middleware nicht aufruft? Wie zu erwarten ist, werden nachfolgende Middlewares nicht ausgeführt ;) Das heißt aber konkret, dass die Abarbeitung des Requests hier tatsächlich am Ende ist. Das macht z. B. Sinn, wenn man eine Middleware zur Authentifizierung erstellt. Ist die Authentifizierung nicht erfolgreich könnte ein HTTP-Status 401 (Unauthorized) gesendet werden und die Verarbeitungskette abgebrochen werden.

Auch gibt es die Möglichkeit, in eine andere Verarbeitungsketten zu verzweigen. Um so bestimmte Requests auf eine andere Art zu behandeln. Das könnte Sinn machen, wenn man Web API und MVC unterschiedlich authentifizieren möchte. Das kann mit der Methode Map gemacht werden:

app.Map("/static", a =>
{
    a.UseStaticFiles();
});

Hier werden bei Anfragen die mit dem Pfad “/static” beginnen, ausschließlich statische Dateien behandelt.

Alexander Schmidt: Back to the roots

Nachdem immer mehr Leser im Feedback angegeben haben, dass das Lesen der Beiträge eher schwieriger wurde, haben wir das Layout komplett neu gewählt. Wir setzen jetzt erst einmal ein Standard „Twenty Fifteen“ von WordPress ein und konzentrieren uns auf kleinere Anpassungen hier. In den nächsten Tagen werden also Updates erfolgen und Ihr seid live dabei!

Karsten Kempe: TFS 2015 Kanban Customization

VisualStudioLogoDie Planungskomponenten des Team Foundation Servers sind nach wie vor einer der Hauptgründe, warum sich Entwicklungsteams für ein Upgrade auf eine neue Version des TFS entscheiden. Zum Release des TFS 2015 wird es einige Erneuerungen für die Visualisierung und Planung von Arbeitspaketen geben. In diesem Beitrag möchte ich Euch das „neue“ Kanban Board vorstellen, dass mit seinen zahlreichen Neuerungen so manches Team begeistern kann.

Generell kann man sagen, dass das neue Kanban Board des TFS 2015 aufgeräumter und übersichtlicher wirkt, als das alte. Zudem hat es größere Kärtchen zur Darstellung zusätzlicher Informationen und bietet einige neue Möglichkeiten für teamspezifische Anpassungen. Außerdem kann nun auch auf dem Board die Abarbeitungsreihenfolge (Backlog-Reihenfolge) geändert und die wichtigsten Arbeitspakete an das obere Ende der Spalte geschoben werden.

TFS_Kanban_Task_2015_RCAbbildung 1: Kanban Board aus TFS 2015 RC2

Neu ist zudem, dass nun der Einstellungs-Dialog mit Hilfe eines Buttons über dem Kanban Board aufgerufen wird. Die on-premise Variante des Team Foundation Server ermöglicht die Anpassung von drei Bereichen auf dem Board – Columns, Swimlanes und Cards.

Positiv aufgefallen ist mir, dass, wie bereits erwähnt, jedes Team eigene Einstellungen vornehmen kann, was gerade in Unternehmen mit vielen Teams und Hierarchie-Ebenen durchaus sinnvoll ist.

TFS_Kanban_Customizing_2015_RC2Abbildung 2: Kanban Einstellungen aus TFS 2015 RC2

Der Einstellungsdialog für Columns hat sich nicht groß geändert. Nach wie vor können zusätzliche Kanban-Spalten erzeugt und deren Reihenfolge angepasst werden. Je nachdem von welcher Version ausgegangen wird, findet man folgende Zusatzfunktionen:

  • Split Column: die Kanban-Spalte wird nochmal unterteilt in „Doing“ und „Done“
  • Definition of Done: zu jeder Spalte können Kriterien festgehalten werden, die das Arbeitspaket erfüllen muss, um den jeweiligen Zustand erfolgreich abzuschließen

TFS_Kanban_Columns_2015_RC2Abbildung 3: Kanban Column-Einstellungen in Team Foundation Server 2015 RC2

Neu hinzugekommen ist die Eigenschaft, sogenannte Swimlanes zu definieren. Swimlanes sind horizontale Bereiche auf einem Kanban Board, um Arbeitspakete nach bestimmten Kriterien zu gruppieren. Zum Beispiel, um hochpriorisierte Arbeitspakete leichter zu identifizieren oder um Arbeitspakete in bestimmte Tätigkeitsbereiche einzusortieren (z.B. Wartung, Features, Architektur, Design, etc.).  Damit erhöht sich die Übersichtlichkeit auf dem Board und die Durchlaufzeit eines Pakets könnte reduziert werden.

TFS_Kanban_Swimlanes_2015_RC2Abbildung 4: Swimlane-Einstellungen im Team Foundation Server 2015 RC2

Eine weitere Neuerung des Team Foundation Server ist das Anpassen von den Kanban-Kärtchen. Für jeden Kärtchen-Typ, Product Backlog Item oder Bug, können individuelle Styles vergeben werden. Bisher können folgende Werte konfiguriert werden:

  • Show ID: damit wird die Work Item ID auf dem Kärtchen gezeigt
  • Assigned To: bietet eine Auswahl, ob ein Foto mit Bearbeitername, nur ein Foto oder nur der Name angezeigt werden soll
  • Show Effort: zeigt das Effort-Feld des Work Items
  • Show Tags: zeigt alle Tags des Work Items
  • Show additional fields: einige weitere Work Item Felder können angezeigt werden

TFS_Kanban_Cards_2015_RC2Abbildung 5: Card Customization des Team Foundation Server 2015 RC2

Mit der Möglichkeit weitere Felder anzuzeigen, wird es in Zukunft auch möglich sein, zusätzliche Visualisierungen auf den Kärtchen abhängig vom Inhalt des Felds zu realisieren. Diese Art des Card-Stylings zeige ich im nächsten Teil, in dem es um Rules und Styles geht.

Zum Abschluss noch ein kleiner Ausblick was bereits jetzt in Visual Studio Online möglich ist. Und zwar werden dort schon die einzelnen Dialoge in einem einzigen Settings-Dialog zusammengefasst.

TFS_Kanban_Customizing_2015_VSOAbbildung 6: Settings-Dialog in Visual Studio Online (Release 17.07.2015)

Wer sich jetzt frägt, ob es diese Einstellungsmöglichkeiten auch auf dem Task-Board gibt, dem muss ich jetzt leider mit „Ja, aber…“ antworten. All diese Möglichkeiten gibt es auch auf dem Task-Board, aber noch nicht zum Release des Team Foundation Server 2015. Visual Studio Online Anwender hingegen dürfen sich schon freuen, dort gibt es alle Features bereits jetzt.

[1] TFS 2015 Planungskomponenten im neuen Gewand

[2] TFS 2015 Kanban Customization

[3] TFS 2015 Card Customization (Rules & Styles)

 

codefest.at [MS]: Free Refactoring Essentials for Visual Studio 2015

Wer mit Visual Studio arbeitet liebt sie – und braucht sie: Tools um produktiv zu arbeiten. Aus der Community gibt es eine sehr coole kostenfreie Extension für Visual Studio 2015, die "Refactoring Essentials for Visual Studio"!

Die Refactoring Essentials bieten – wie der Name verrät – Refactoring und Code Analyzer direkt in Visual Studio an. “The premier free Visual Studio 2015 extension for C# and VB.NET refactorings, including code best practice analyzers to improve your projects.”

Die Extension wurde ganz aktuell (gestern) auf Version 1.1. aktualisiert:
VisualStudioGallery: Refactoring Essentials for Visual Studio

image

Die Installation der VS Extension erfolgt wie gewohnt ruck zuck
– und funktioniert auch für die niegel-nagel-neue Visual Studio 2015 RTM Version.

image image

Nach der Installation stehen die Code Analyzer sofort bereit, wie etwa in diesen Beispielen hier.

Mit CTRL + . (oder Anklicken des Icons) können die Empfehlungen jederzeit geöffnet werden.

image

…an verschiedensten Stellen raten die Refactoring Essentials zur Vereinfachung:

image

Das Besondere daran ist, dass die Refactoring Essentials kostenfrei sind, eine tolle Qualität besitzen, Extensions für eigene Anpassungen unterstützen und dass sie vom icsharpcode-Team entwickelt wurden – siehe Contributors.

Hier geht es zur http://vsrefactoringessentials.com/ Website.

image

Wow, sogar Scott Hanselman hat die Tools in seinem Blog beschrieben:
VS Refactoring Essentials (formerly) NR6Pack - Free analyzers and refactoring for Visual Studio 2015

image

Die Refactoring Essentials Sourcen sind auf GitHub unter MIT-Lizenz verfügbar:
icsharpcode/RefactoringEssentials. Issues können hier gemeldet werden.

VS Refactoring Essentials sind aus SharpDevelop in NRefactory und danach in NRPack übergegangen. Die letzte stabile Version (Ende Mai 2015) war NRefactory Version 6. Mit Refactoring Essentials wurde die IDE komplett überarbeitet (code completion, refactorings, etc.) und verwendet nun den neuen Roslyn Compiler (Open Source auf GitHub).

Weitere Infos über die Extensions sind hier zu finden:
Andreas Weizel: NRefactory & NR6Pack Finally Roslyn-ized und
Christoph Wille: Refactoring Essentials for Visual Studio.

Die Refactoring Essentials sind eine große Hilfe zur Verbesserung der eigenen Code-Qualität und stellen eine echte Alternative zu kommerziellen Tools dar (nein, ich nenne sie jetzt nicht “ReSharper für Arme” – seht euch die Funktionalität einfach selbst einmal an).

Ein großes Danke an die Autoren der coolen kostenfreien Extensions “Refactoring Essentials for Visual Studio 2015”!

Für die letzten Neuerungen folgt den Refactoring Essentials auf Twitter: @vsrefactoring!

Norbert Eder: C# 6: Null-conditional Operator

Wer kennt es nicht, das ständige Prüfen auf null bevor auf Eigenschaften zugegriffen oder Methoden ausgeführt werden. Damit wollen wir eine NullReferenceException möglichst vermeiden. Diese Prüfungen sehen etwa wie folgt aus:

Person firstPerson = null;
var newAddress = new Address();

if (firstPerson != null)
{
    firstPerson.Relocate(newAddress);
}

Weit schlimmer sieht das bei komplexeren Objektbäumen/Datenstrukturen aus. Mit C# 6.0 bietet mit dem null-conditional Operator eine Vereinfachung:

Person firstPerson = null;
var newAddress = new Address();

firstPerson?.Relocate(newAddress);

Mit ?. wird der Zugriff nur ausgeführt, wenn die Variable auf ein Objekt zeigt. Das funktioniert mittels ?[ allerdings auch für Index-Operationen:

var street = firstPerson?.Addresses?[0]?.Street;

Das sieht doch weit besser aus als:

string street;
if (firstPerson != null 
    && firstPerson.Addresses != null 
    && firstPerson.Addresses.Count > 0)
{
    if (firstPerson.Addresses[0] != null)
    {
        street = firstPerson.Addresses[0].Street;
    }
}

Oder nicht?

Der Einsatz bei Delegates/Events klappt ebenfalls wunderbar (thread-sicher):

public delegate void ChangeAddress(Address address);
...
public event ChangeAddress AddressChanged;
...
public void Relocate(Address address)
{
    PhysicalAddress = address;

    AddressChanged?.Invoke(address);
}

Die bisherige Variante im Vergleich dazu:

var changed = AddressChanged;
if (changed != null)
{
    changed(address);
}

Viel Spaß damit :)

The post C# 6: Null-conditional Operator appeared first on Norbert Eder.

Code-Inside Blog: Semantic Versioning in a nutshell

I made a short tweet today and it seems I hit a nerve:

Because I like blogging I decided to write a small blogpost about SemVer.

Why Semantic Versioning (SemVer)

In our industry we use version numbers a lot. The typical naming is MAJOR.MINOR.PATCH, sometimes also MAJOR.MINOR.PATCH.BUILD or instead of PATCH you could say REVISION - it is more or less the same.

But the problem is: This is not very self describing. What is MAJOR or a REVISION? When should I change the MAJOR version and when should I increase the MINOR version etc. You see: It sounds simple, but it is really complicated.

SemVer

SemVer is a pretty simple concept to give each part a better description.

Given a version number MAJOR.MINOR.PATCH, increment the:

  • MAJOR version when you make incompatible API changes,
  • MINOR version when you add functionality in a backwards-compatible manner, and
  • PATCH version when you make backwards-compatible bug fixes.
  • Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format.

If you change your API with breaking changes: Increase the MAJOR version. A new feature? Increase the MINOR version. Bugfix? Simple…

So in short: Breaking.Feature.Bugfix

It’s a technical solution - don’t try to get nice Marketing-Version-Numbers

SemVer is a technical solution - if you want to get great Marketing-Version-Numbers this will probably fail, so maybe you should split the “commercial” and “technical” version number.

Learn more

I had read the “Breaking.Feature.Bugfix” summary somewhere else, but I can’t remember the original author (Kudos!), but I received this Tweet with a full talk about exactly this topic, so if you want to learn more:

Well…

Just for fun:

;)

Hope this helps!

Sven Hubert: TFS PowerShell Scripting: Product Backlog Item (PBI) und Arbeitsaufgaben für ein Team erstellen

Norbert Eder: Visual Studio 2015 ist da!

Seit 20. Juli 2015 ist Visual Studio 2015 verfügbar. Zeitgleich wurde .NET in der Version 4.6 veröffentlicht. Und es hat sich eine ganze Menge getan:

  • JSON Editor
  • Support für JavaScript Package Manager (Grunt, Gulp, etc.)
  • Zusammenführung ser Debugging und Diagnostic Tools
  • Neue Sprachfeatures für C#, VB und C++
  • ASP.NET 4.6 inkl. Unterstützung für HTTP/2
  • Cross-Platform Mobile Development Tools mit Support für iOS, Android und Windows
  • Verbesserungen für die Teamzusammenarbeit im agilen Umfeld

Alle Änderungen findest du in den Visual Studio Release Notes näher beschrieben.

Und nun ab zum Visual Studio 2015 Download.

Edit: Visual Studio 2013 Update 5 kam gleichzeitig.

The post Visual Studio 2015 ist da! appeared first on Norbert Eder.

Jürgen Gutsch: ASP.NET 5 Release-Plan und Roadmap

Gestern, am 20. Juli wurde das Visual Studio 2015 released, sowie das .NET 4.6 und das Update 5 für das Visual Studio 2013. Mehr dazu hier in diesem Beitrag: Visual Studio 2015 and .NET 4.6 Available for Download

Was nicht released wurde ist ASP.NET 5. Der Grund ist unter anderem wohl der, dass .NET Core noch nicht soweit ist. 

So wie es auf Github steht, wird es noch 3 Beta-Versionen geben, im November dann eine RC1 und Anfang nächsten Jahres (Q1) ein Release:

Milestone Release Date
Beta6 27 Jul 2015
Beta7 24 Aug 2015
Beta8 21 Sep 2015
RC1 Nov 2015
1.0.0 Q1* 2016

Nichts desto trotz lohnt es sich jetzt schon, ASP.NET 5 und .NET Core genauer anzuschauen, zumal die Toolunterstützung in Visual Studio 2015 und Visual Studio Code bereits jetzt schon vorhanden ist.

(via Visual Studio 2015 Released plus ASP.NET 5 Roadmap)

Manfred Steyer: Visual Studio Code mit TypeScript und Angular 2 nutzen

Das neue Visual Studio Code, welches derzeit in der Version 0.5 vorliegt, ist ein leichtgewichtiger und plattform-übergreifend verfügbarer Code-Editor mit unterstützung für TypeScript 1.5. Auch Angular 2 setzt auf TypeScript 1.5 und somit bietet es sich an, erste Gehversuche mit Angular 2 unter Nutzung von Visual Studio Code zu unternehmen. Das dürfte auch einer der Gründe sein, warum selbst auf Google-Konferenzen Mitglieder aus dem Angular-Team immer auf Visual Studio Code zurückgreifen.

Um ein erstes Beispiel mit der vorliegenden Version 0.5 zum Laufen zu kriegen, sind ein paar Schritte notwendig, die ich nachfolgend in Form einer Schritt-für-Schritt-Anleitung festhalte. Dabei beziehe ich mich auf den 5 Min Quickstart auf angular.io. Da sich bei Angular 2 Details noch laufend ändern, findet man dort die aktuellsten Informationen.

  1. Visual Studio Code installieren (wer hätte das gedacht): https://code.visualstudio.com/
  2. Sicherstellen, dass NodeJS installiert ist, da im nachfolgenden der Node-Package-Manager npm genutzt wird: http://node.org/
  3. TypeScript installieren: npm install -g typescript
  4. Sicherstellen, dass die neueste Type-Script-Version über die Umgebungsvariable path zuerst gefunden wird. Zum Testen kann man auf der Kommandozeile via tsc -v die aktuelle Version abrufen.
  5. Den Package-Manager für Type-Script-Typ-Definitions-Dateien installieren. Laut 5 Min Quickstart auf angular.io erfolgt dies mit npm install -g tsd@^0.6.0
  6. Im Root des Projektes mit Visual Studio Code eine Datei tsconfig.json anlegen:
    {
     "compilerOptions": {
         "module": "commonjs",
         "sourceMap": true,
         "target": "ES5",
         "experimentalDecorators": true,
         "emitDecoratorMetadata": true
     } 
    }
  7. Ggf. muss man ab nun Visual Studio Code ab und an neu starten, damit Änderungen an zentralen Steuerungsdateien erkannt werden.
  8. Konsole im Root des Projektes öffnen (Strg+Shift+C) und die Typ-Definitionen für Angular 2 gemäß dem 5 Min Quickstart auf angular.io laden: tsd install angular2 es6-promise rx rx-lite
  9. Eine Datei app.ts und index.html gemäß den Angaben des 5 Min Quickstart auf angular.io anlegen. Der Vollständigkeit halber wiederhole ich die beiden Dateien am Ende.
  10. Zum Kompilieren Strg+Shift-b drücken
  11. Visual Studio Code legt nun eine Datei tasks.json an. Hier setzt man am besten die Eigenschaft args auf ein leeres Array, damit sämtliche TypeScript-Dateien berücksichtigt werden. Darüber hinaus sollte man isShellCommand auf true setzen:
     "args": [], 
     "isShellCommand": true,
  12. Beim Kompilieren mit Strg+Shift+b sollten nun eine app.js und eine app.js.map erstellt werden.
// app.ts
import {Component, View, bootstrap} from 'angular2/angular2';

@Component({
    selector: 'my-app'
})
@View({
    template: '<h1>Hello {{ name }}</h1>'
})
class AppComponent {
    name: string;

    constructor() {
        this.name = 'Susi';
    }

}

bootstrap(AppComponent);
<!-- index.html -->
<html>
  <head>
    <title>Angular 2 Quickstart</title>
    <script src="https://github.jspm.io/jmcriffey/bower-traceur-runtime@0.0.87/traceur-runtime.js"></script>
    <script src="https://jspm.io/system@0.16.js"></script>
    <script src="https://code.angularjs.org/2.0.0-alpha.31/angular2.dev.js"></script>
  </head>
  <body>

    <!-- The app component created in app.ts -->
    <my-app></my-app>

    <script>System.import('app').catch(console.error.bind(console));</script>

  </body>
</html>

Automatisch kompilieren

Zum automatischen Kompilieren könnte man die Tastenkombination STRG+s zusätzlich mit dem Kompilierungsschritt belegen. Dazu wählt man die Option File | Preferences | Keyboard Shortcuts. Danach trägt man die folgenden Daten im erscheinenden Fenster ein:

[
    {
        "key": "ctrl+s",          
        "command": "workbench.action.tasks.build" 
    }
]

Alternativ dazu könnte man auch in der tsconfig.json einen Eigenschaft watch mit dem Wert true eintragen. Das bewirkt, dass der Type-Script-Kompiler nach dem ersten Kompilieren mit STRG+SHIFT+b das gesamte Projektverzeichnis überwacht und bei Änderungen an .ts-Dateien die Kompilierung erneut durchführt.

Kompilate (.map- und .js-Dateien) ausblenden

Um die aus .ts-Dateien kompilierten Dateien auszublenden wählt man die Option File | Preferences | User Settings. Anschließend trägt man das nachfolgend gezeigte Schnippsel ein. Die ersten beiden zu ignorierenden Dateien sind dabei den Standardeinstellungen von Visual Studio Code entnommen. Darauf folgt die Angabe, .js-Dateien auszublenden, sofern eine gleichnamige .ts-Datei existiert. Die letzte Zeile blendet sämtliche .map-Dateien aus.

{
    "files.exclude": {
        "**/.git": true,
        "**/.DS_Store": true,
        "**/*.js": { "when": "$(basename).ts"},
        "**/*.map": true
    }
}

Marco Scheel: Links for 2015-07-20 [del.icio.us]

codefest.at [MS]: Visual Studio 2015 Final Release Event

MS_VS-Download_Hero-1180x295

Der zweite Teil des Visual Studio 2015 Launch Events läuft noch und schon ist weiterer technischer Inhalt online. In 60 Feature-Videos werden einzelne neue oder verbesserte Funktionen in Visual Studio 2015, Team Foundation Server 2015 und Visual Studio Online erklärt.

Darunter sind Funktionen wie IntelliTest oder auch das neue Build System. Der x-Plattform Ansatz hinter dem neuen Build System zeigt für mich sehr stark wie offenen das Toolset geworden ist.

Die Inhalte sowie auch die Keynote sind on-demand auf channel9 abrufbar.

Eines meiner Highlights an neuen Funktionen: Team Build for 2015 (die 4 Minuten 45 Sekunden zahlen sich aus)

Martin Richter: Ein kleiner Doppelschlag: RTM für VisualStudio 2015 und VisualStudio Update 5

Heute haben zwei neue VisualStudio Versionen das Licht des RTM erblickt 😉

VisualStudio 2015 ist verfügbar und zeitgleich wurde auch VisualStudio 2013 Update 5 veröffentlicht.

Achtung: Wer als Sprache Deutsch angegeben hat, der bekommt aktuell (Stand 21.07.2015) noch die RC-Seite auf der deutschen Microsoft Seite angezeigt. Die englische Seite zeigt den RTM Artikel.

PS: Einzig vermisse ich noch die MBCS Bibliotheken für den RTM. Als RC waren sie verfügbar und der aktuelle Link auf den Microsoft Seiten funktioniert nicht. Auch wenn ich die nur für ein einziges Legacy Programm noch nutze.


Copyright © 2010 Martin Richter
Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.
(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)

Ralf Westphal: Geschätztes Desaster

Glauben Sie noch, dass sich Aufwände in der Softwareentwicklung abschätzen lassen? Ja, wirklich? Dann beruht Ihr Glaube zumindest zum Teil auf der Vorstellungen, dass sich Schätzfehler ausgleichen. Mal schätzen Sie etwas zu wenig Aufwand, ein andermal aber schätzen Sie etwas zu viel Aufwand. Oder? Ja, das hört sich plausibel an. Manche Aufgaben stellen sich als schwieriger heraus, als gedacht,

Karsten Kempe: TFS 2015 Planungskomponenten in neuem Gewand

VisualStudioLogoDer neue Team Foundation Server 2015 steht vor der Tür und bringt einige Neuerungen für den Anwender. Nach wie vor sind die Planungskomponenten des TFS einer der Hauptgründe, warum sich Entwicklungsteams und Unternehmen zu einem Upgrade auf die neue Version entscheiden. Die teamspezifischen Backlogs-, Kanban- und Task-Boards sind eine enorme Hilfe bei der Visualisierung von Arbeitspaketen. In einer mehrteiligen Serie möchte ich Euch einige neue Features vorstellen, die im TFS 2015 enthalten sein werden. Ebenso möchte ich Euch einen kleinen Ausblick auf Neuerungen geben, die es voraussichtlich noch nicht in den RTM geschafft haben, aber bereits in der Cloud-Variante des TFS (Visual Studio Online) zu finden sind.

Das bisherige Kanban Board des TFS 2013 visualisiert Arbeitspakete in bekannter Kanban-Spalten-Optik, transportiert aber außer dem Titel, dem Bearbeiter und der Paketgröße keine weiteren Informationen. Um zusätzliche Infos zu einem Arbeitspaket zu erhalten, wie z.B. ID, Priorität, Business Value, etc., muss das Work Item erst geöffnet werden. Etwas lästig, wenn man in einer Planungsrunde nur schnell ein paar Infos vom Board ablesen möchte. Auch die fehlende Möglichkeit aus der Kanban-Sicht neue Arbeitspakete anzulegen, wurde in der Vergangenheit öfters kritisiert.

TFS_Kanban_Task_2013.4Abbildung 1: Kanban Board des Team Foundation Server 2013 Update 4

In den letzten Wochen und Monaten wurde sehr intensiv von Microsoft an den Planungskomponenten des Team Foundation Servers gearbeitet. Mit Erfolg wie ich finde. Die neue Version des TFS bringt eine neue Kanban-Optik mit größeren Kärtchen, mehr Informationen und mit besseren Möglichkeiten teamspezifische Anpassungen vorzunehmen.

Zusätzlich zu den anpassbaren Kanban-Kärtchen gibt es die Möglichkeiten, die Kärtchen zu priorisieren und die wichtigsten an das obere Ende der Spalte zu schieben. Damit ändert sich auch die Reihenfolge in der Backlog-Ansicht. Bisher ging diese Umsortierung nämlich nur in der Backlog-Ansicht, was immer ein lästiges Hin- und Her-Schalten zur Folge hatte.

TFS_Kanban_Task_2015_RCAbbildung 2: Kanban Board des Team Foundation Server 2015 (RC2)

Außerdem lassen sich jetzt auch neue Kärtchen direkt auf dem Kanban-Board erzeugen, indem man auf das grüne Plus drückt. Diese Funktion ist in Planungsrunden äußerst praktisch, da Kärtchen direkt in der ersten Spalte angelegt und beschriftet werden können.

Auch sehr praktisch ist die Suchfunktion der ersten Spalte. Damit lässt sich bei einem längeren Backlog nach bestimmten Arbeitspaketen suchen, die dann trotz gefilterter Spalteninformation per Drag ‚n‘ Drop verschoben werden können.

Im Task-Board wird es ebenfalls die Möglichkeit geben die Kärtchen anzupassen, um diese mit zusätzlichen Informationen auszustatten – unabhängig vom Karten-Typ (Task, Bug, PBI, etc).

Einen Ausblick auf eine Neuerung im Sprint-Backlog möchte ich Euch zum Abschluss noch mit auf den Weg geben. Zukünftig können neue Produkt Backlog Items oder Bugs auch direkt im Sprint-Backlog angelegt werden. Diese Funktion gibt es bisher nur im allgemeinen Product Backlog und nicht auf Sprint-Ebene.

TFS_TaskBoard_NewPBI_VSOAbbildung 3: Sprint-Backlog aus Visual Studio Online (Release 07.07.15)

Im nächsten Teil der Serie zeige ich Euch, wie man im neuen Team Foundation Server teamspezifische Kanban-Boards erzeugen kann und welche Möglichkeiten es zur Anpassung geben wird.

[1] Teil 1 – TFS 2015 Planungskomponenten in neuem Gewand

[2] Teil 2 – TFS 2015 Kanban Customization

[3] Teil 3 – TFS 2015 Card Customization (Rules & Styles)

Marco Scheel: Links for 2015-07-19 [del.icio.us]

Jürgen Gutsch: ASP.NET 5 Hosting im Detail

ASP.NET 5 lässt sich auf mehrere Arten hosten. Die einfachsten habe ich im letzten Beitrag beiläufig gezeigt. Aber auch der IIS kann ASP.NET 5 Webs ausführen. Auch hier gehe ich nicht auf das Visual Studio ein, sondern rein auf die .NET Utilities und die nötigen Code-Dateien.

WebListener

Wenn man neues ASP.NET 5 Projekt mit dem VS2015 erstellt hat man das Kommando web in der project.json stehen, so wie es letzten Beitrag der Fall war.

Das ist ein kleiner Entwicklungs-Server, mit dem das Testen, Ausprobieren und Debuggen ein bisschen einfacher funktioniert, als über das Deployment per IIS (mehr dazu unten). Dieser WebServer ersetzt den IIS Express für die Arbeit mit ASP.NET 5 (Für ASP.NET 4.6 hat der IIS Express weiter seinen Nutzen.)

Das Kommando sieht wie folgt aus:

[code language="JScript"]"web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5001"[/code]

Die benötigte NuGet-Dependency ist:

[code language="JScript"]"Microsoft.AspNet.Server.WebListener": "1.0.0-beta5",[/code]

Kestrel

Ebenso schlank und einfach zu handhaben ist der WebServer Kestrel. Dieser basiert auf die freie Bibliothek Libuv und ist optimal geeignet ASP.NET 5 unter Linux auszuführen. Kestrel lässt sich in isolierten Umgebungen problemlos auch produktiv nutzen. Vor allem Ideal auf IoT-Geräten wie den Raspberry PI und in Docker-Containern.

Das Kommando:

[code language="JScript"]"kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:5004"[/code]

Die NuGet-Referenz:

[code language="JScript"]"Kestrel": "1.0.0-beta5"[/code]

Libuv
“libuv is a multi-plattform support library with a focus on asynchronous I/O. It was primarily developed for use by Node.js, …”
(https://github.com/libuv/libuv/)

Mit Kestrel bringt Microsoft das ASP.NET 5 dem Node.js IMHO ein weiteres Stück näher. Nicht nur die Integration von NPM und Node.js in das neue Visual Studio 2015, sondern in die komplette ASP.NET 5 Umgebung. Aber dazu mehr in einem der nächsten Beiträge.

Wie man ein ASP.NET 5 Web mit Kestrel unter Linux auf dem Raspberry PI zum laufen bring habe ich in einen der letzten Beiträge bereits gezeigt.

IIS / Azure

Das Hosting im IIS (gleiches gilt auch für Azure) ist manuell etwas aufwendiger als über das Visual Studio 2015, in dem wir einen Wizzard zum publizieren zur Verfügung haben. Im Prinzip gilt, dass das Projekt erst publiziert werden muss. Während diesem Publizieren, werden die Abhängigkeiten in das Publikationsverzeichnis kopiert und – was am interessantesten ist – die Assembly der Applikation wird eben falls als NuGet Package bereitgestellt. NuGet scheint überall zu sein…

Nehmen wir als Grundlage wieder die project.json und die Startup.cs aus dem vorigen Beitrag für unser Web im IIS. Wir müssen die project.json etwas anpassen um das Hosting im IIS zu ermöglichen. Wir müssen eine Referenz zu "Microsoft.AspNet.Server.IIS" hinzufügen. Die Kommandos könnten wir entfernen, sie schaden hier aber auch nicht. Im Gegenteil helfen sie beim schnellen Entwickeln, ohne jedes Mal publizieren zu müssen.

Nach dieser Anpassung wechseln wir mit einer beliebigen Konsole in das WebVerzeichnis und aktualisieren erst Mal die NuGet referenzen:

[code language="JScript"]> dnu restore[/code]

Dann können wir – auch wieder mit Hilfe des dnu commandos das Projekt publizieren:

[code language="JScript"]> dnu publish --out c:\git\aspnet5deploy --no-source --runtime dnx-coreclr-win-x64.1.0.0-beta5-12103[/code]

Wir müssen ein Output-Verzeichnis angeben sowie die gewünschte Runtime. Der optionale Parameter –no-source gibt an, ob die Sourcen mit ausgeliefert werden sollen oder nicht.

Die Runtime gibt an, mit welchem .NET Framework die Applikation arbeiten soll. Zur Verfügung stehen clr für das .NET Framework und clrcore für das .NET Core, jeweils in 64-bit und 32-bit.

Das Ergebnis im Output-Verzeichnis ist interessant es enthält tatsächlich alle Abhängigkeiten die für die Ausführung benötigt wird. Sogar die Runtime wird mitgeliefert:

image

Schaut man in das Packages-Verzeichnis finden wir dort das NuGet Paket unseres Projektes:

image

Der Ordner wwwroot enthält die eigentliche Web-Anwendung, inklusive einer web.config und eines Bin-Verzeichnisses, welches allerdings nur eine einzige DLL enthält. Eine DLL mit dem Namen AspNet.Loader.dll. Hierbei handelt es sich um eine .NET Framework Assembly die sich wohl um das Laden der ASP.ENT Anwendung und deren Abhängigkeiten kümmert.

Schaut man in die web.config sieht man wie sie die nötigen DLLs finden kann:

[code language="ASPX"]<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="bootstrapper-version" value="1.0.0-beta5" />
    <add key="runtime-path" value="..\approot\runtimes" />
    <add key="dnx-version" value="1.0.0-beta5-12103" />
    <add key="dnx-clr" value="coreclr" />
    <add key="dnx-app-base" value="..\approot\packages\aspnet5\1.0.0\root" />
  </appSettings>
</configuration>[/code]

Die Pfade zur Runtime und zur App-Assemblie sind hier definiert.

Der Ordner wwwroot muss im IIS noch als Web angelegt werden und schon kann das Web über den IIS aufgerufen werden.

Golo Roden: Zug um Zug: Docker-Images effizient aufbauen

Docker-Images sind schichtweise aufgebaut. Die Dokumentation von Docker empfiehlt, die Anzahl der Schichten zu minimieren, ohne allerdings konkrete Hinweise zu geben, wie man das Ziel erreichen könne. Einige Tricks helfen, Docker-Images effizient zu bauen.

Sven Hubert: AIT Sim-Shipping with Visual Studio 2015

Holger Sirtl: Azure News on Friday (KW29/15)

Auch diese Woche gab’s wieder viele Nachrichten zur Microsoft Azure Plattform. Hier sind nähere Infos dazu…

Aktuelle Neuigkeiten

Datum Nachricht
17.07. Enhancing Azure VMs Security with ESET
Neu in der Azure Marketplace Security Extension Kategorie: ESET File Security Extension für Windows-basierte VMs
17.07. Episode 179: Oxford APIs with Mat Velloso
Hintergründe zur Implementierung von How-old.net und Twins-or-not mit Hilfe von AzureML und der Oxford API
17.07. Updates to the Mobile Apps server SDK
Neues Mobile Apps .NET Server SDK (v0.2.549) Achtung: Breaking Changes (um Entwicklung hybrider Apps zu erleichtern)
16.07. Rendering 3D Modelled Scenes with Azure Batch with Karan Batta
Scott zeigt wie in Autodesk Maya 2015 via Plugin Azure Batch für das effiziente Rendering verwendet werden kann
16.07. The growing challenge for consumer health devices: keeping up with medical regulatory requirements
Herausforderung in IoT Szenarien im medizinischen Bereich: Compliance in der Datenverarbeitung bei Gerätevielfalt
16.07. How exactly does Event Hubs Throttling Work?
Hintergründe zum Throttling in den Throughput Units (TU) des Azure Event Hub - faires Ausbremsen und Exceptions
16.07. Integrate your on-premises infrastructure with Azure
Neue Version des Datacenter Extension Reference Architecture Diagram - Guide zu Planung hybrider Cloud-Architekturen
16.07. Announcing the general availability of Media Encoder Standard
Azure Media Encoder Standard allgemein verfügbar - mehr Dateiformate und Codecs, besseres H.264 Encoding etc.
16.07. Azure Site Recovery GA: Move VMware, AWS, Hyper-V and Physical Servers to Azure
Azure Site Recovery jetzt allgemein verfügbar - Absicherung von VMware, AWS, Hyper-V, Linux, Windows Workloads
16.07. Extensible Triggers and Binders with Azure WebJobs SDK 1.1.0-alpha1
Eigene WebJobs Trigger mit quasi beliebigen auslösenden Ereignissen mit dem Azure WebJobs SDK 1.1.0-alpha1
15.07. Azure Marketplace announces new features and functionality
Neues im Azure Marketplace - neue Compute Offerings (z.B. Multi-VM), Docker Hub Integration und Container Apps
15.07. New capabilities added to Power BI
Neue Möglichkeiten in PowerBI: Office 365 App Launcher, eigene URLs, Storage Management
15.07. Announcing new and improved DataStax Cluster deployment experience on Azure Marketplace
Neu im Azure Marketplace: DataStax Cassandra Cluster (BYOL): Mit einem Mausklick einen 4-, 12- oder 36-Kern Cluster bereitstellen
15.07. Working with Marketplace Images on Azure Resource Manager
VM Images aus dem Azure Marketplace via Azure Resource Manager und dem Preview Portal noch leichter nutzen
15.07. Importing Data to DocumentDB Just Keeps Getting Better
Weitere Verbesserungen des Azure DocumentDB Data Migration Tools: Unterstützung für Blob Storage, Amazon DynamoDB etc.
15.07. Configuring Barracuda Web Application Firewall for Azure App Service Environment
Anleitung zum Setup einer Barracuda Web Application Firewall zur Absicherung einer (ggf. verteilten) Azure App Service Umgebung
15.07. Azure HDInsight launches ISV Partner Program at WPC
Ein neues Partnerprogramm hilft ISVs, ihre HDInsight-Lösungen auf Microsoft Azure zu bringen.
15.07. Visualize big data with Power BI and Spark on Azure HDInsight
Anleitung zur Visualisierung von Big Data Workloads mit PowerBI und Spark on Azure HDInsight
14.07. Expanding Linux and OSS Support on Azure
Erweiterte Support-Optionen für Linux- und OSS-Workloads auf Microsoft Azure.
14.07. Manage your Azure Linux VM logs through Operations Management Suite
Linux VMs mit Operational Insights und der Operations Management Suite verwalten.
14.07. Using Azure Resource Manager in Azure Automation Runbooks
Nutzung des Azure Resource Managers in Azure Automation Runbooks zum automatisierten Setup von Azure Umgebungen
14.07. How to use Azure Search with D3.js to Build Interactive Data Visualizations
Nutzung von Azure Search und Aufbereitung und Visualisierung der Ergebnisse via D3.js
14.07. Managing SSH-Enabled Linux Hosts with Azure Automation
Azure Automation unterstützt jetzt neben Windows VMs auch SSH-aktivierte Linux Hosts
13.07. Azure Resource Manager Template for RDS Deployment
Für den Azure Resource Manager ist ein neues Template zum Deployment einer RDS Umgebung verfügbar
13.07. At WPC, Microsoft helps businesses transform data into intelligent action
Ankündigung der Cortana Analytics Suite auf Microsofts Worldwide Partnerkonferenz
13.07. Announcing Cortana Analytics Suite and New Partner Investments at WPC 2015
Cortana Analytics Suite bringt Microsofts digitale Sprachassistentin mit verschiedenen Datenanalyseservices zusammen
13.07. The Power BI app for Android is now available
Die PowerBI App zur Visualisierung und Auswertung von Daten ist jetzt auch auf Android verfügbar

Marco Scheel: Links for 2015-07-17 [del.icio.us]

codefest.at [MS]: Webcast - Microsoft Edge für Developer

Windows 10 bringt neben vielen anderen Neuerungen auch einen neuen Browser – Microsoft Edge.
Aber warum eigentlich ein neuer Browser und was bedeutet dass für Anwender und Webentwickler?

In diesem TechTalk sprechen Daniel und Malte über Microsoft Edge, den neuen Browser in Windows 10. Hierbei geht es insbesondere um die Beweggründe für einem neuen Browser und die Auswirkungen für Entwickler.

Außerdem gibt es einen Einblick in die neuen Funktionen in Microsoft Edge sowie die Tools, welche Entwickler nutzen können um ihre Webapplikationen zu verbessern (z.B. http://dev.modern.ie/tools/staticscan/).

Zum Schluss geben die beiden noch ein paar Tipps, was man für eine standardkonforme Website und alle modernen Browser beachten sollte.

Jürgen Gutsch: ASP.NET 5 ganz klein

Um zu beweisen wie leichtgewichtig ASP.NET 5 ist, möcht ich hier einmal zeigen was es benötigt, um eine ASP.NET 5 Anwendung zu starten. Ich gehe hier mal Schritt für Schritt vor, ohne auf das Tooling direkt einzugehen (Außer dort wo es nötig wird) Es geht also nur um die Code-Dateien, deren Abhängigkeiten und darum wie man die Applikation startet.

Der Editor ist ist beliebig. Wobei Unterstützung für C# und JSON nicht schlecht wäre, es tut aber auch ein einfacher Notepad.

project.json

Im letzten Beitrag habe ich erwähnt, dass es keine Projektdatei mehr gibt. Wir benötigen nun eine Datei mit dem Namen project.json. In dieser Datei legen wir unter anderem die Laufzeitumgebung fest, die NuGet-Referenzen und die Start-Kommandos:

Eine Minimalistische project.json könnte in etwa so aussehen:

{
  "version": "1.0.0-*",
  "webroot": "wwwroot",

  "dependencies": {
    "Kestrel": "1.0.0-beta5",
    "Microsoft.AspNet.Diagnostics": "1.0.0-beta5",
    "Microsoft.AspNet.Hosting": "1.0.0-beta5",  
    "Microsoft.AspNet.Server.WebListener": "1.0.0-beta5",
    "Microsoft.AspNet.StaticFiles": "1.0.0-beta5",
    "Microsoft.Framework.Logging.Console": "1.0.0-beta5"
  },

  "commands": {
    "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5001",
    "kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:5004"
  },

  "frameworks": {
    "dnxcore50": { }
  },

  "exclude": [
      "wwwroot"
  ]
}

Die Version 1.0.0-* wird festgelegt und als webroot wird der Ordner wwwroot angelegt. Der webroot ist der Ordner in dem statische Ressourcen (Bilder, Styles und Scripts) abgelegt werden. Alles was absolut referenziert wird, verweist auf diesen Ordner. Der Ordner muss tatsächlich existieren, sonst gibt es beim Start eine Fehlermeldung.

Darunter haben wir die NuGet Dependencies. Hier werden alle direkten Abhängigkeiten inklusive der Versionsnummer angegeben.

Anschließend sehen wir die Kommandos mit dem Namen web und kestrel wobei der Name egal ist, es kommt auf das eigentliche Kommandos an. Hier wird in beiden Fällen ein minimalistischer Webserver gestartet. Der HttpServer Kestrel ist für die Ausführung unter Linux geeignet, läuft aber genauso unter Windows. Beide hören auf “http://localhost:5001” , bzw. “http://localhost:5004” (In weiteren Beiträgen gehe ich näher auf die beiden Hosting varianten und die Kommandos ein.)

Der vorletzte Block definiert das gewünschte Framework, mit dem diese Applikation laufen soll. In diesem Fall ist es das .NET Core. Hier könnte auch dnx451 für das .NET Framework 4.5.1 stehen.

Der letzte Block listet Elemente die aus der OWIN Pipeline ausgeschlossen werden sollen, also direkt aufrufbar sind. Hier wird der komplette Ordner wwwroot ausgeschlossen

Startup.cs

Diese project.json bringt jetzt natürlich nichts, wenn es keinen ausführbaren Code gibt. Daher benötigen wir eine Startup.cs die mindestens so aussehen könnte:

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
    }
   
    public void ConfigureServices(IServiceCollection services)
    {
    }

    public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole();
        app.UseStaticFiles();
        app.UseWelcomePage();
    }
}

Hier passiert erst Mal nichts weiter, außer dass ein Console Logger, die StaticFiles Middleware und eine UseWelcomePage Middleware eingehängt werden. Wer Microsofts OWIN Implementation Katana noch kennt wird das alles wiedererkennen. Wir arbeiten hier ebenso mit Middlewares die wir in den Prozess einhängen können.

Damit hätten wir nun einen Webserver das Statische Dateien ausliefern kann. Im Prinzip eine minimalistische ASP.NET 5 Anwendung. Alle Requests (bis auf das wwwroot) gehen durch diese ASP.NET 5 Pipeline und können nun verarbeitet werden.

Erster Aufruf

Der Start erfolgt über eine beliebige Console. Zuerst wechsle ich in das Arbeitsverzeichnis und installiere dann die aktuellste Runtime :

> dnvm install latest -r coreclr -arch x64

Mit dem .NET Version Manager (dnvm) habe ich hier die aktuellste Runtime der coreclr in der 64-bit Version gewählt. Dieses Kommando setzt auch den Pfad zur Runtime in der aktuellen Consolen Session.

Nun müssen wir mit die aktuellste Abhängigkeiten herstellen. Das heißt in unserem Fall die NuGet packages die in der project.json angegeben sind:

> dnu restore

Zu guter Letzt, können wir die ASP.NET 5 Applikation starten:

> dnx . web

image

Rufen wir die angegebene URL auf, sehen wir die Welcome Page, die wir mit app.UseWelcomePage() eingebunden haben:

image

Wir können nun jede beliebige Datei in den Ordner wwwroot legen und im Browser aufrufen.

Wie gehts weiter?

In den nächsten Beiträgen möchte ich in diesem Beitrag entstandene Codebasis nutzen um diese weiteren Themen zu behandeln:

  • ASP.NET Hosting im Detail
  • Middlewares im Detail
  • Dependency Injection im Detail
  • ASP.NET Web API aktivieren
  • ASP.NET MVC 6 Aktivieren

codefest.at [MS]: Sommer Developer Wettbewerb - Web Kategorie

In der letzten Woche haben wir unseren Sommer Developer Wettbewerb gestartet und seit dem werden in den verschiedenen Kategorien fleißig Punkte gesammelt.

Auch die Fertigstellung von Windows 10 steht kurz bevor und somit auch die unseres neuen "browser for doing”Microsoft Edge. Höchste Zeit also für die Details zur Web Kategorie – quasi der Schlüssel für die nächsten 200 Punkte.

Es geht darum eine "vernünftige" Webseite - z.B. eine persönliche Webseite mit üblichen Informationen und zumindest mehr als einer Seite - zu erstellen und zwar gemäß dem HTML5 Standard - damit auch der Edge seine Freude damit hat ;-).
P.S. nachdem wir ja nicht alle bestehenden Webseiten kennen, kann das natürlich auch eine schon bestehende sein…

Gewinnspielanleitung im Detail:

  1. Eine HTML5 konforme Webseite erstellen - Tipps dazu z.B. unter Microsoft Edge | Dev
  2. E-Mail an wettbewerb@microsoft.com, mit dem Link auf Eure Webseite
  3. Wir testen die Konformität der Webseite mittels:
    - W3C Markup Validation Service - keine Fehler oder Warnings
    - Dem Site Scan Tool - kein Fehler in "Modern Web Interoperability"
  4. erspielte Punkte: Abhängig von der Komplexität der Webseite bis zu 200.

Ablauf

  • Sobald du mindestens zwei Kategorien erledigt hast: Mail an uns schicken mit den einzureichenden Infos an: wettbewerb@microsoft.com
  • Wenn du danach noch weitere Punkte sammeln willst, einfach wieder eine Email an uns mit den einzureichenden Infos schicken .
  • Nach jeder Email bekommst du von uns deinen Punktestand.

Alle Details und die weiteren Kategorien findet Ihr im Blog Post Der große Sommer Developer Wettbewerb.

Lets make the Web a nicer place!!!

Lars Keller: DNUG Braunschweig Treffen - Moderne Architekturen für Web, Desktop und Mobile mit NInject und Caliburn.Micro

Die DNUG Braunschweig trifft sich am 22.07.2015 um 19:00 im Restaurant Zucker (Tagungsraum). Dieses Mal hält unser Mitglied Holger Mester zusammen mit Karsten Samaschke einen Vortrag über Moderne Architekturen.

Abstract:
Feste Verdrahtungen im Code? Komponenten, die ihre Abhängigkeiten selbst verwalten? Codebehind-Programmierung im Exzess? Das muss doch nicht sein! Karsten Samaschke zeigt in diesem Vortrag, wie mit Hilfe von NInject und Caliburn moderne und wartbare Architekturen für Web, Desktop und Mobile aufgesetzt werden können und wie einfach die Verwendung von Dependency Injection- und eines MVVM-Frameworks sein kann, wenn man die richtigen Komponenten dafür einsetzt

Wie immer ist die Veranstaltung kostenlos!
Weitere Informationen zur DNUG Braunschweig können hier gefunden werden: http://www.dotnet-braunschweig.de

Marco Scheel: Links for 2015-07-14 [del.icio.us]

Manfred Steyer: Versionierte Web-APIs mit Swagger dokumentieren

Im Beitrag unter [1] habe ich gezeigt, wie man mit Routing-Constraints Web APIs versionisieren kann. Die in den Controllern hinterlegten Versionsnummern können auch von Swashbuckle [2] genutzt werden, um herauszufinden, welche Action-Methode zu welcher Version der Swagger-Dokumention gehört. Dazu implementiert man eine Methode mit der nachfolgend gezeigten Signatur. Sie nimmt die Beschreibung einer Action-Methode sowie eine Version entgegen und liefert true, falls die Methode in der Dokumentation der jeweiligen Version aufscheinen soll. Hierzu greift die hier gezeigte Methode auf die Eigenschaft Version des Attributs VersionedRoute zu:

private static bool ResolveVersionSupportByRouteConstraint(
                                        ApiDescription apiDesc, 
                                        string targetApiVersion)
{
    var attr = apiDesc
                    .ActionDescriptor
                    .GetCustomAttributes<VersionedRoute>()
                    .FirstOrDefault();

    if (attr == null) return true;
    return attr.Version == targetApiVersion;
}

Um Swashbucke nun Informationen über die vorliegenden Versionen zukommen zu lassen, nutzt man in der Konfiguration die Methode MultipleApiVersions. Der erste übergebene Lambda-Ausdruck delegiert an die zuvor diskutierte Funktion weiter; der zweite registriert die einzelnen Versionen. Die standardmäßig genutzte Methode SingleApiVersion, welche zum Einsatz kommt, wenn nur eine Version vorliegt, wird hingegen nicht mehr aufgerufen.

// Diese Zeile auskommentieren:
// c.SingleApiVersion("v1", "VersioningSample");

c.MultipleApiVersions(
    (apiDesc, targetApiVersion) => ResolveVersionSupportByRouteConstraint(apiDesc, targetApiVersion),
    (vc) =>
    {
        vc.Version("3", "Swashbuckle Voucher API V3");
        vc.Version("2", "Swashbuckle Voucher API V2");
        vc.Version("1", "Swashbuckle Voucher API V1");
    });

Hat das funktioniert, erhält man beim Aufrufen der Swagger-Dokumentation zunächst nur Informationen zur neuesten Version:

Gibt man in der Url eine andere Versionsnummer an, bekommt man die hierzu passenden Methoden:

Wer eventuelle Versionsnummern, die in den Klassennamen der Controller auftauchen, verbergen möchte, kann in der Swashbuckle-Konfiguration eine eigene Gruppierung für die Action-Methoden festlegen. Das nachfolgende Beispiel gruppiert die Methoden nach dem Controller-Namen, entfernt jedoch zuvor einen eventuellen Suffix, welcher aus Ziffern besteht. Dabei liegt die Annahme zugrunde, dass solch ein Suffix eine Versionsnummer wiederspiegelt.

c.GroupActionsBy(apiDesc => {

    var name = apiDesc.ActionDescriptor.ControllerDescriptor.ControllerName;
    name = Regex.Replace(name, @"^(.*?)([\d]*)$", @"$1");
    return name;

});

[1] http://www.softwarearchitekt.at/post/2015/07/14/web-apis-versionisieren.aspx
[2] http://www.softwarearchitekt.at/post/2015/06/15/web-apis-mit-swagger-dokumentieren.aspx

Jürgen Gutsch: ASP.NET 5 allgemein

ASP.NET 5 funktioniert anders als man es bisher kennt. ASP.NET 5 ist eine komplette Neuentwicklung die mit dem bisherigen ASP.NET nichts zu tun hat.

Open Source

ASP.NET 5 ist komplett Open Source. Unter https://github.com/aspnet/home sind alle Sourcen zu finden, sowie Dokumentation und erste Schritte Anleitungen zu ASP.NET 5. Ebenso .NET Core ist auf GitHub zu finden: https://github.com/dotnet/corefx 

Wer sich übrigens den aktuellen Build Status von .NET Core, Roslin, etc. ansehen möchte kann das über folgende Jenkins Installation machen: http://dotnet-ci.cloudapp.net/

Ja, Microsoft verwendet hier Jenkins, anstelle des TFS :) Macht natürlich Sinn, wenn sowohl für Linux und Mac gebaut werden muss.

dnxcore5

Wer Owin/Katana kennt, wird sich in ASP.NET 5 zurecht finden, denn es basiert sehr stark auf diesem Konzept und implementiert auch die OWIN Spezifikation. ASP.NET 5 läuft auf beiden zukünftigen .NET varianten, auf .NET 4.6 und auf dem neuen .NET Core. Das klassische ASP.NET allerdings ausschließlich auf .NET 4.x.

Weiterhin unterstützt ASP.NET 5 kein WebForms. Es funktioniert also nicht ohne weiteres, bestehende ASP.NET WebForms Applikationen auf ASP.NET 5 zu heben. 

ASP.NET 5 Applikationen die ausschließlich für .NET Core optimiert sind, sollten auch unter .NET 4.x laufen. Allerdings nicht andersrum, sollten Bibliotheken genutzt werden, die Abhängigkeiten zum .NET 4.x haben.

Linux

Dadurch dass .NET Core auch unter Linux und MacOS läuft, lassen sich auch ASP.NET 5 Applikationen auf dem Mac oder auf Linux ausführen. Das bringt enorm viel Flexibilität, was die Zielplattform und das Einsatzgebiet angeht. ASP.NET 5 auf dem Raspberry PI hatte ich ja bereits beschrieben, aber auch der Einsatz in Docker-Containern ist dadurch möglich.

*.csproj ?

Wer ein Projekt über ein ASP.NET 5 Template im Visual Studio öffnet, wird sich das erste Mal neu orientieren müssen. Die Ordnerstruktur im Solution Explorer hat sich etwas geändert, so gibt es nun Referenzen für Bower und NPM, sowie für jedes Target Framework das genutzt werden soll (z. B. “dnx451” für .NET 4.5.1 und dnxcore5 für das .NET Core)

Es gibt neu einen Ordner namens “wwwroot” der alle statischen Dateien (Bilder, Styles, JavaScripts) enthalten wird. Alle statischen Dateien werden relativ zu “wwwroot” geladen.

Visual Studio Code

Ganz anders als bisher wird es keine typische Visual Studio Projektdatei mehr geben, sondern lediglich eine project.json. Spätestens hier zeigt sich sowohl die Plattformunabhängigkeit, als auch die Unabhängigkeit von Visual Studio. Jeder beliebige Editor kann verwendet werden um ASP.NET 5 Applikationen zu schreiben. Microsoft selber hat mit Visual Studio Code einen Plattformunabhängigen Editor bereitgestellt, der C# unterstützt und (zumindest unter Windows) das Debuggen von .NET Core, bzw. ASP.NET 5 Applikationen:

VSCode

System.Web

Wie eingangs erwähnt ist ASP.NET 5 und .NET Core eine komplette Neuentwicklung. Der Grund dafür ist unter anderem auch die System.Web.dll die über die letzten Jahre, seit es das .NET Framework gibt, gewachsen ist. Jeder der Software über mehrere Jahre schreibt und wartet, kennt de Problematik, wenn es plötzlich heißt weitere Plattformen zu unterstützen. Es ist schlicht und einfach nicht bezahlbar, so ein großes Stück Software so zu refactoren, dass es auf unterschiedlichen Plattformen läuft und gleichzeitig alte Software unterstützt die darauf basiert. Eine Neuentwicklung ist um ein vielfaches billiger.

Ohne die Abhängigkeit zur System.Web und der .NET CLR ist ASP.NET 5 natürlich um einiges leichtgewichtiger.

NuGet

Weiterhin basiert .NET Core komplett auf NuGet. Das bedeutet, alle Teile des .NET Core können als NuGet Package hinzugeladen werden. Man baut sich also sein eigens .NET Core Framework zusammen und liefert es mit seiner Anwendung aus. Mehrere Versionen der .NET Core können so parallel auf einem Server laufen ohne, dass sie sich gegenseitig beeinflussen. Auch ein Update der .NET CLR oder der Mono CLR hat keinen Einfluss. Zur genannten Flexibilität kommt also auch ein stückweit Stabilität hinzu.

mehr…

In weiteren Beiträgen werde ich zeigen, wie man eine minimalistische ASP.NET 5 Applikation nur mit Visual Studio Code aufsetzt, um zu verdeutlichen wie Leichtgewichtig ASP.NET geworden ist. Einiges habe ich in vergangenen Beiträgen schon genannt, aber da das Release-Datum von Visual Studio 2015 nun näher rückt, werde ich die Basics nochmals in den Fokus rücken. in der Hoffnung dem einen oder anderen damit ASP.NET 5 näher zu bringen.

Code-Inside Blog: Using PCLs in ASP.NET

Weird Error Message:

Compilation Error

Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.

Compiler Error Message: CS0012: The type ‘System.Object’ is defined in an assembly that is not referenced. You must add a reference to assembly ‘System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’.

Fix:

Put this Assembly-Reference in the web.config:

<compilation debug="true" targetFramework="4.5">
    <assemblies>
        <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </assemblies>
</compilation>

Reason:

This error occures when you are using Portable Class Libraries (PCLs) inside ASP.NET Projects. This Blogpost provides a pretty good answer. In short: It’s an issue between runtime and build time - PCLs that are used in Razor are runtime stuff.

I (re-)blogged this because I had this issue more than once ;)

Hope this helps!

Manfred Steyer: Web APIs versionisieren

Sobald mehr als eine Version einer Web API, zum Beispiel aus Gründen der Abwärtskompatibilität, parallel zur Verfügung gestellt werden, muss der Aufrufer angeben können, welche Version er adressieren möchte. Eine dazu häufig genutzte Möglichkeit stellt der Einsatz eines HTTP-Headers, der die Versionsnummer wiederspiegelt, dar:

api-version: 3

Ab ASP.NET Web API 2.1 können solche Header vom Attribut-basierten Routing berücksichtigt werden. Dazu sind pro Route Einschränkungen zu hinterlegen. Dazu implementiert der Entwickler das Interface IHttpRouteConstraint. Dieses gibt eine Methode Match vor, welche Web API aufruft, wenn es eine Route in Erwägung zieht. Dabei übergibt Web API Informationen über den aktuellen Aufruf. Retourniert Match den Wert true, zieht Web API die damit assoziierte Action-Methode in die engere Auswahl. Liefert Match hingegen false, so wird die jeweilige Route in weiterer Folge ignoriert.

Das nachfolgende Listing zeigt eine IHttpRouteConstraint-Implementierung, welche prüft, ob im Rahmen der benutzerdefinierten Kopfzeile api-version eine bestimmte, über den Konstruktor festgelegte Versionsnummer übergeben wurde. Zu den Kontext-Informationen, die Web API an Match übergibt, gehört eine HttpRequestMessage, welche den aktuellen Aufruf beschreibt, eine IHttpRoute-Implementierung, welche Auskunft über die assoziierte Route gibt sowie ein Dictionary mit den Routing-Parametern. Zu diesen Routing-Parametern zählen sämtliche Werte, die in die Platzhalter der Route eingesetzt wurden sowie auch die restlichen URL-Parameter. Der Parameter parameterName weist einen in diesem Fall frei wählbaren Namen. Einschränkungen Routing-Parameter würden hingegen als parameterName den Namen des jeweiligen Routing-Parameters übergeben bekommen. Der Wert des Enums HttpRouteDirection informiert darüber, ob die Einschränkung beim Auflösen einer Url auf eine Route oder beim Auflösen einer Route auf eine Url zur Anwendung kommt.

public class VersionConstraint : IHttpRouteConstraint
{
    public string Version { get; set; }

    public VersionConstraint(string version)
    {
        this.Version = version;
    }

    public bool Match(
                System.Net.Http.HttpRequestMessage request, 
                IHttpRoute route, 
                string parameterName, 
                IDictionary<string, object> values, 
                HttpRouteDirection routeDirection)
    {
        var version = request
                            .Headers
                            .GetValues("api-version")
                            .FirstOrDefault();
        if (version == null) return false;
        if (version == this.Version) return true;
        return false;
    }
}

Um eine IHttpRouteConstraint-Implementierung mit einer Route zu assoziieren, leitet der Entwickler von der Klasse RouteFactoryAttribute ab und überschreibt deren Property Constraints, sodass sie ein Dictionary mit den gewünschten IHttpRouteConstraint-Implementierungen retourniert. Als Key wird dabei jener Parametername, den Web API an Match übergeben soll, verwendet. Das nächste Listing demonstriert dies für den zuvor betrachteten VersionConstraint.

public class VersionedRoute : RouteFactoryAttribute
{
    private string version;

    public VersionedRoute(string template, string version)
        : base(template)
    {
        this.version = version;
    }

    public override IDictionary<string, object> Constraints
    {
        get
        {
            var result = new Dictionary<string, object>();
            result.Add("version", new VersionConstraint(version));
            return result;
        }
    }

}

Das auf diese Weise erhaltene RouteFactoryAttribute-Derivat kann nun anstatt des Attributes Route verwendet werden, um eine Attributbasierte-Route zu definieren. Das nachfolgende Listing demonstriert dies, für das hier betrachtete Beispiel, anhand zweier Action-Methoden, welchen dieselbe Url zugewiesen wird. Um die erste der beiden Methoden zu adressieren muss der Aufrufer nun, entsprechend der oben beschriebenen Einschränkung, über den benutzerdefinierten Kopfzeileneintrag api-version den Wert 1 übergeben; für die zweite Methode hingegen den Wert 2.

[RoutePrefix("api")]
public class VoucherController : ApiController
{
    [VersionedRoute("voucher", "1")]
    public string Post([FromUri] int value)
    {
        return Guid.NewGuid().ToString();
    }

    [VersionedRoute("voucher", "2")]
    public string Post2([FromUri] int value, [FromUri] string currency)
    {
        return Guid.NewGuid().ToString();
    }

}

Die versionisierten Action-Methoden können sich auch in unterschiedlichen Controllern befinden und dabei die selben Routen nutzen. So kann zum Beispiel der nachfolgende Controller mit dem zuvor betrachteten co-existieren:

[RoutePrefix("api")]
public class Voucher3Controller : ApiController
{
    [VersionedRoute("voucher", "3")]
    public string Post2(VoucherRequest request)
    {
        return Guid.NewGuid().ToString();
    }
}

Der von diesem Controller verwendete VoucherRequest findet sich der Vollständigkeit halber nachfolgend.

public class VoucherRequest
{
    public int Value { get; set; }
    public string Currency { get; set; }
    public string Name { get; set; }
}

Jürgen Gutsch: Anchor-TagHelper in ASP.NET MVC 6

Den Anchor-TagHelper hatte ich schon im allgemeinen Beitrag über die TagHelpers kurz beschrieben. Allerdings nicht im Detail, was ich hier kurz wiederholen möchte.

Also, zum Vergleich nochmals die alte Razor-Schreibweise:

@Html.ActionLink("About me", "About", "Home", new {}, new { @class = "btn"})

Die neue Schreibweise in Form eines TagHelpers:

<a asp-controller="Home" asp-action="About" class="btn">About me</a>

Das Ergebnis ist in beiden Fällen das folgende:

<a href=" /Home/About" class="btn">About me</a>

Was nun aber zusätzlich möglich ist, ist analog zum Form-HtmlHelper, nämlich die Art wie die Route beeinflusst werden kann, so kann mit asp-route eine benannte Route angesprochen werden, so dass der dort definierten Controller und die definierte Action genutzt werden können oder dass die entsprechenden Regeln der Route gelten..

Mit Attributen die den Prefix asp-route- enthalten, können beliebige URL-Parameter an die erstellte URL angehängt werden. Ein beliebtes Beispiel ist eine returnurl die an den Pfad angehängt wird:

asp-route-returnurl="@ViewBag.ReturnUrl"

friends header

bloggers headline

links header

 
Don't contact us via this (fleischfalle@alphasierrapapa.com) email address.