.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv Juli 2015

Windows 10 ist erschienen

30.07.2015 09:53:05 | Mathias Gronau

Nun ist es so weit: gestern ist Windows 10 offiziell erschienen. Das neue Betriebssystem ist ab heute für ein Jahr als kostenloses Upgrade für qualifizierte Windows 7 und Windows 8.1 PCs sowie Tablets weltweit verfügbar. Anwender bringen ihre Rechner mit wenigen Schritten auf den neuesten Stand. Auch der Handel ist auf das Upgrade vorbereitet: So werden Geräte angeboten, die bereits auf Windows 10 optimiert sind. Im stationären Handel soll es dazu Hilfestellungen geben, von der Beratung bis hin zur kompletten Installation vor Ort. Microsoft empfiehlt allen Anwendern das Upgrade: Die neue Windows Generation ist nicht nur schneller und sicherer, sie ermöglicht einen persönlicheren Zugang zu Technologien und erstmals eine einheitliche Nutzererfahrung auf allen Devices. In puncto Qualitätssicherung ist Windows 10 zudem das am meisten getestete Betriebssystem. Analysten, Partner und IT-Profis sehen zum Start von Windows 10 bereits großes Potential für die gesamte Branche. Alexander Stüger, Vorsitzender der Geschäftsführung von Microsoft Deutschland, drückt es wie folgt aus: „Windows 10 ist der Leuchtturm für die Transformation von Microsoft. Mit Windows 10 schaffen wir eine persönlichere Nutzererfahrung, definieren Produktivität neu und bauen weiter an der intelligenten Cloud.“ Verfügbarkeit als kostenloses Upgrade Mit der Verfügbarkeit von Windows 10 als kostenloses Upgrade geht Microsoft neue Wege: Erstmals in der Geschichte stellt Microsoft mit Windows 10 sein Betriebssystem für ein Jahr als kostenloses Upgrade für Windows 7 und Windows 8.1 Geräte zur Verfügung. Mehr noch, die neue Windows Generation folgt dem neuen Prinzip „Windows as a Service“: Nach der Installation des Windows 10 Upgrades erhalten Geräte darüber hinaus während ihrer gesamten Lebenszeit kostenlose Aktualisierungen. Das gilt nicht nur für Sicherheitsupdates, sondern auch für funktionale Erweiterungen. Nun ist Microsoft ein kommerzielles Unternehmen und mancher fragt sich, weshalb die Company ihr Betriebssystem verschenkt. Macht es doch gar nicht. Wenn Sie einen Rechner mit vorinstalliertem Windows kaufen, hat der Hersteller selbstverständlich einen Obolus nach Redmond gezahlt. Und wenn Sie in den stationären Handel gehen und sich eine Kopie von Windows holen, zahlen Sie für die Home-Version 135 Euro und für die Professional 279 Euro (UVP). Mittelfristig möchte Microsoft alle Geräte, die unter Windows laufen, auf einen einheitlichen Stand bringen und sich so die Unterstützung älterer Betriebssystemversionen ersparen. Damit wird nicht nur die Sicherheit erhöht, auch die Wartungskosten sinken dadurch. Deshalb hat sich Microsoft auch das ambitionierte Ziel gesetzt, Windows 10 innerhalb von zwei bis drei Jahren auf einer Milliarde Geräten zu installieren. Umfangreiche Qualitätssicherung Auch im Bereich der Qualitätssicherung hat Microsoft ein neues Vorgehen gewählt: Seit Oktober haben fünf Millionen Anwender am Insider-Programm teilgenommen und konnten damit eine Preview von Windows 10 testen und ihr Feedback an die Produkt-Entwicklung senden. Über drei Millionen Feedback-Nachrichten erreichten bislang die Windows 10-Entwickler, dazu kommen 2,5 Millionen Antworten auf Umfragen unter den Insidern. Auch in Deutschland geben die Insider fleißig Rückmeldung: Nach den USA, China und Großbritannien kommt der meiste Input aus Deutschland. Im Ergebnis ist Windows 10 heute das am meisten getestete Betriebssystem von Microsoft. „Microsoft hat zugehört, denn noch nie konnten Anwender so früh und umfassend Einfluss auf die Entwicklung einer […]

SSLPeerUnverifiedException in Verbindung mit Android und IIS8

24.07.2015 10:07:00 | Martin Hey

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.

Update 14.08.2015
Nach einiger Recherche habe ich nun herausgefunden, dass die neueren HttpClients durchaus in der Lage sind, mit SNI umzugehen. In der App in der das Problem auftrat hatte ich Spring for Android in der Version 1 verwendet. Der HttpClient dort hat das Problem mit SNI. Die neuere Version 2 von Spring for Android verwendet einen HttpClient, der problemlos damit umgehen kann.

ASP.NET 5 Middlewares im Detail

24.07.2015 00:47:00 | Jürgen Gutsch

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.

ASP.NET 5 Release-Plan und Roadmap

21.07.2015 07:17:01 | Jürgen Gutsch

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)

ASP.NET 5 Hosting im Detail

20.07.2015 01:36:00 | Jürgen Gutsch

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.

ASP.NET 5 ganz klein

17.07.2015 01:32:00 | Jürgen Gutsch

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

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

15.07.2015 14:51:04 | Lars Keller

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

ASP.NET 5 allgemein

15.07.2015 01:28:00 | Jürgen Gutsch

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.

Satya Nadella präsentiert auf der WPC Neuigkeiten rund um die Microsoft Cloud

14.07.2015 08:32:16 | Mathias Gronau

Derzeit läuft in Orlando/Florida Microsofts Worldwide Partner Conference. Gestern hat CEO Satya Nadella seine gehalten und einige Neuigkeiten rund um die Microsoft Cloud-Angebote, das Partner-Netzwerk und den persönlichen Assistenten Cortana bekanntgegeben. An der Konferenz, die bis zum 16. Juli geht, nehmen insgesamt mehr als 10.000 Partner aus mehr als 130 Ländern teil. Hier die Ankündigungen in Kürze: Project GigJam ist ein Meilenstein auf dem Weg des Unternehmens, Produktivität und Businessprozesse neu zu erfinden. Es hilft Business-Anwendern, Daten über verschiedene Geräte, Anwendungen und Plattformen zu aggregieren und mit anderen zu teilen, um Entscheidungen noch schneller und besser treffen zu können. Das Preview-Programm zu GigJam startet demnächst. Cortana Analytics Suite ist ein umfassendes Set von Services und Anwendungen für die Vorhersage von Trends und Geschäftsentwicklungen sowie die weitgehend automatische Entscheidungsfindung. Die Cortana Analytics Suite verknüpft führende Big Data Cloud-Technologien wie HD Insight, Machine Learning oder Event Hubs mit Werkzeugen für „Perceptive Intelligence“, das heißt der intelligenten Auffassungsgabe und Datenverarbeitung, zum Beispiel im Rahmen von Text- oder Sprachanalysen. Dazu zählen der digitale Assistent Cortana sowie Tools zur Sprach- und Gesichtserkennung und zur Analyse von Texten, Bildern und komplexen Daten. Die Suite wird ab Herbst dieses Jahres per Monatsabo auf den Markt kommen. In seiner Keynote präsentierten Microsoft-CEO Satya Nadella und der CAD-Anbieter Autodesk einen Showcase für die kommerzielle Nutzung des weltweit ersten Holografie-Computers, der Microsoft HoloLens. In der Präsentation war zu sehen, wie Design Professionals in Zukunft entwerfen, kommunizieren und visualisieren werden. Auf der WPC kündigte Satya Nadella auch Neuigkeiten rund um das Cloud Solution Provider-Programm (CSP) an, das seit einem Jahr in mehr als 40 Ländern läuft und Partnern bei ihrem Einstieg in Cloud-Technologien hilft. Zu den 40 existierenden werden 91 neue Märkte hinzukommen. Zudem werden neben Office 365, Windows Intune und die Enterprise Mobility Suite (EMS) nun auch Microsoft Azure und CRM Online Teil des CSP-Programms. Aufgrund der großen Nachfrage wird Microsoft neue Optionen für Partner anbieten, Business mit Microsoft Surface zu entwickeln. Dafür weitet Microsoft die Zahl der Reseller des Tablet-PCs in den kommenden Monaten von einigen hundert auf einige tausend aus. Nadella bekräftigte in seiner Keynote, dass das Surface integraler Bestandteil der Windows-Strategie von Microsoft ist. Mit dem Launch von Windows 10 werden sich dabei ganz neue Geschäftsmöglichkeiten ergeben. Ende des Jahres wird es mit E5 eine neue Version der Office 365 Enterprise-Suite geben. Die Suite umfasst die bewährten Produktivitäts- und Kollaborationswerkzeuge von Office, enthält aber auch signifikante Erweiterungen. Dazu zählen Neue Dienste in Skype for Business-Services wie Cloud PBX und Meeting Broadcast, Power BI und Analytics, darunter Power BI Pro und Delve Organizational Analytics. Die E5-Suite bietet darüber hinaus erweiterte Sicherheitsfunktionen wie eDiscovery, Customer Lockbox und Advanced Threat Protection. Die Suite ermöglicht Partnern, eigene Anwendungen auf der Basis von Office 365 zu erstellen und zu vermarkten.Ausführliche Informationen zu den Ankündigungen der #WPC15 von gestern finden Sie in einem Blogpost von Phil Sorgen, Corporate Vice President, Worldwide Partner Group, Microsoft.

Anchor-TagHelper in ASP.NET MVC 6

13.07.2015 01:59:00 | Jürgen Gutsch

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"

DDoS Attacke im IIS blocken

11.07.2015 01:42:00 | Jürgen Gutsch

Gestern bin ich Zeuge einer möglichen DDoS-Attake auf eine Website eines Kunden geworden. Die Website reagierte mit einer Fehlerseite. Der Grund des Fehlers war ein Connection Timeout der Datenbank. Es dauerte eine Weile, bis wir raus hatten, was eigentlich los war.

Zwischen 3 Uhr und 9 Uhr morgens wurden mit 1.7 Millionen Requests über ein Terrabyte an Daten abgerufen, nur mit dem permanenten Aufruf der Startseite. Da machte dann irgendwann die Datenbank (Azure SQL DB) schlapp. Die Azure Web-App hätte vielleicht noch liefern können:

image

Erst ein Blick in die Webserver-Logs brachte Klarheit über den Grund des DB-Ausfalls. Das Log war voll mit Anfragen aus der ganzen Welt, mit einer Gemeinsamkeit: Alle Anfragen hatten den User-Agent WordPress/<version>;+<domain>

Nach etwas Recherche erfuhren wir, dass es einen Kritischen Bug in älteren WordPress und Drupal Versionen gibt, mit denen ein Aufruf einer anderen Website ausgelöst werden kann:

Also irgendwer oder irgendwas hat über ungepatchte WordPress Installationen Anfragen auf diese Website abgefeuert. Die Anfragen kamen wahrscheinlich von echten WordPress Installationen aus der ganzen Welt, denn die IP-Adresse in der Log-Datei war identisch mit der Adresse der Domain im User-Agent.

Nun musste ein Weg gefunden werden diese Anfragen zu blocken. Zuerst blockten wir über eine Eintrag in der Web.Config alle IP-Adressen, außer unsere eigenen, um die Server zu entlasten:

<ipSecurity allowUnlisted="false" denyAction="AbortRequest">
    <add allowed="true" ipAddress="[Unsere IP-Adresse 1]"/>
    <add allowed="true" ipAddress="[Unsere IP-Adresse 2]"/>
</ipSecurity>

Anschließend blockierten wir zu schnelle Anfragen von gleichen IP-Adressen:

<dynamicIpSecurity>
    <denyByConcurrentRequests enabled="true" maxConcurrentRequests="10"/>
    <denyByRequestRate enabled="true" maxRequests="100" requestIntervalInMilliseconds="7000" />
</dynamicIpSecurity>

Beide Einträge müssen unter </system.webServer></security> vorgenommen werden. Den ersten Eintrag <ipSecurity> kann man auch nutzen um bekannte IP-Adressen zu sperren. Da die Adressen in diesem Fall aber alle verschieden waren und auch nicht einer Region zugeordnet werden konnten, ist dieser Eintrag aber unbrauchbar für einen DDoS-Schutz

Der zweite Eintrag dämpft die Last einer solchen Attacke eventuell etwas, macht bei einer Verteilten-Attacke aber wohl eher wenig aus.

Ein Hinweis in der MSDN, solche Anfragen per URL-Rewrite zu lösen brachte dann die Lösung. Es ist über das IIS Url-Rewrite möglich eingehende Anfragen anhand der Header zu identifizieren und umzuleiten oder gar zu blocken. Wir mussten also alle Anfragen, deren User-Agent-Header mit WordPress* starten blocken:

<rule name="Block WordPress DOS" patternSyntax="Wildcard" stopProcessing="true">
  <match url="*" />
  <conditions>
    <add input="{HTTP_USER_AGENT}" pattern="WordPress*" ignoreCase="true" negate="false" />
  </conditions>
  <action type="AbortRequest" />
</rule>

Dieser Eintrag muss in der web.config ganz oben an erster Stelle unter <system.webServer><rewrite><rules>, da die erste Rule als erste abgearbeitet wird.

Später kann dann die Liste der Conditions beliebig erweitert werden.

Alle Anfragen die auf diese Art identifiziert werden, werden komplett blockiert. Es wird nicht mal mehr ein Eintrag im Log des Webservers geschrieben.

Ich hoffe das dieser Beitrag auch anderen hilft, schnell auf so eine Attacke zu reagieren.

Microsoft bringt mit Power BI am 24. Juli 2015 Cloud-basiertes Werkzeug zur Datenauswertung und -visualisierung auf den Markt

10.07.2015 19:26:34 | Mathias Gronau

Heute hat Microsoft die generelle Verfügbarkeit von Power BI ab dem 24. Juli 2015 angekündigt: ein Cloud-basierter Dienst für Datenauswertung und -visualisierung in Echtzeit. Power BI ist Teil eines umfassenden Microsoft-Portfolios für Business Intelligence, zu dem auch der aktuell als Preview verfügbare SQL Server 2016 sowie eine wachsende Zahl von Microsoft Azure Services, wie HDInsight, Machine Learning oder Event Hubs gehören. Real Madrid visualisiert mit Power BI und Power Maps zum Beispiel Spiel- und Spielerdaten und kann darauf basierend schnell und einfach die eigene Spielstrategie verbessern. Power BI ist in der Basisversion kostenlos. Visualisierungs-Framework sowie Visuals über Github ab sofort verfügbar Die wichtigste Neuerung: Microsoft bietet bereits ab heute das Visualisierungs-Framework sowie die Visuals von Power BI über Github als Open Source-Tool an. „Mit diesem Schritt trägt Microsoft dem Wunsch vieler Kunden Rechnung, ihre individuellen Vorstellungen professionell umsetzen zu können“, sagt Hans Wieser, Business Lead Data Platform bei Microsoft Deutschland. „Das Framework bietet einfach verwendbare Standards etwa von Infodesign oder nach den Success-Empfehlungen von Prof. Hichert an. Dabei geht es nicht nur um neue Formen und Farben, sondern vor allem um die individuelle Gestaltung von Dashboards und Reportings und damit um die freie Wahl der besten visuellen Darstellung.“ Genauere Informationen hat Microsoft für den kommenden Montag angekündigt.  

Input-TagHelper in ASP.NET MVC 6

10.07.2015 02:39:00 | Jürgen Gutsch

Im Grunde funktionieren die Input-TagHelpers genauso wie die Select-TagHelpers. Das Attribut asp-for aktiviert den TagHelper und bindet ihn an eine Eigenschaft des aktuellen Models.

<input asp-for="FirstName" />

Auch das gerenderte HTML unterscheidet sich erst Mal nicht wirklich:

<input name="FirstName" id="FirstName" class="form-control" />

Nutzt man dagegen ein Model, dass man mit DataAnnotations versehen hat, um Eingabe Regeln zu definieren, so werden automatisch die nötigen Attribute zur Ausgabe der Validierungs-Meldungen ausgegeben:

public class ContactViewModel
{
    [Required]
    [MaxLength(255)]
    public string FirstName { get; set; }
}

<input name="FirstName" id="FirstName"
    class="form-control"
    data-val-required="The FirstName field is required."
    data-val-maxlength-max="255"
    data-val-maxlength="The field FirstName must be a string or array type with a maximum length of '255'."
    data-val="true" />

Im Vergleich dazu die alte Schreibweise:

@Html.TextBoxFor(model => model.FirstName, new { @class = "form-control" })

Wie auch bei allen anderen HtmlHelpern, können wir die Elemente mit Standard-Attributen erweitern. Würde man mehrere HTML-Attribute in der alten Schreibweise hinzufügen, so würde die Syntax schnell unübersichtlich werden und HTML-Entwickler die kein Razor können würden schnell überfordert sein.

Select-TagHelper in ASP.NET MVC 6

09.07.2015 00:38:00 | Jürgen Gutsch

Je mehr ich TagHelper nutze, desto mehr bin ich der Meinung, dass sie ein enormer Fortschritt sind. Die klassische Razor-Schreibweise war schon genial im vergleich zu ASP.NET WebForms und der ASP.NET Schreibweise im ASP.NET MVC. Die TagHelpers steigern das jedoch. Die Arbeit an den Views ist nun extrem natürlich und ohne Syntax-Wechsel möglich.

Wie alle TagHelper ist auch der select-TagHelper erstaunlich einfach zu handhaben. Das asp-for-Attribut bindet das HTML-Element an eine Property des aktuellen Models und aktiviert den Tag Helper:

<select asp-for="Country">
</select>

Daraus wird:

<select name="Country" id="Country">
</select>

Nun können beliebig Elemente eingefügt werden

<select asp-for="Country">
    <option value="DE">Deutschland</option>
    <option value="CH">Schweiz</option>
    <option value="AT">Österreich</option>
</select>

Das Ergebnis ist wie erwartet. Aber interessanter ist natürlich das dynamische Hinzufügen von Elementen. Wir benötigen einfach eine Liste mit Ländern, entweder per ViewBack, im Model oder per Dependency-Injection zur Verfügung gestellt. Letztere Variante ist aus meiner Sicht die sauberste.

Also angenommen wir injecten einen CoutryService mit einer Eigenschaft AllCountries:

@inject DiViews.Services.ICountryService countryService;

Das sähe das select-Element ganz einfach wie folgt aus:

<select asp-for="Country" class="form-control"
       asp-items="coutryService.AllCountries">
</select>

Die alte Schreibweise im Vergleich

@Html.@Html.DropDownListFor(model => model.Country, countryService.AllCoutries, new { @class = "form-control" });

Das Ergebnis könnte das gleiche sein wie im Beispiel mit den manuell hinzugefügten Elementen:

<select name="Country" id="Country" selected="selected" class="form-control">
    <option selected="selected" value="DE">Deutschland</option>
    <option value="CH">Schweiz</option>
    <option value="AT">Österreich</option>
</select>

Wie auch bei allen anderen HtmlHelpern, können wir die Elemente mit Standard-Attributen erweitern. So können wir einfach multiple="multiple" hinzufügen, um eine Mehrfachauswahl zu erlauben, oder wie oben gezeigt eine CSS-Klasse annhägen.

TDD am Beispiel

08.07.2015 10:02:21 | Hendrik Loesch

Bezieht man sich bei der testgetriebenen Entwicklung nur auf die blanke Theorie, so bleiben die eigentlichen Vorteile häufig zu abstrakt. Im nachfolgenden Video wird deshalb eine sehr einfache Code Kata gelöst. Auf diese Weise soll gezeigt werden wie produktiv man mit den entsprechenden Werkzeugen arbeiten kann und wie sehr die so entstandene Testabdeckung bei der […]

Form-TagHelper in ASP.NET MVC 6

08.07.2015 01:18:00 | Jürgen Gutsch

Das MVC Konstrukt mit dem HtmlHelper um ein Formular zu erzeugen hat mich immer ein wenig gestört:

@using (Html.BeginForm("ControllerName", "ActionName")) {
    //Form Contents Here
}

Je nach Umfang des Formulars und entsprechender Parameter kann das irgendwann doch sehr unübersichtlich werden. Da ist es doch wesentlich angenehmer und “natürlicher” Formulare mit HTML-Tags zu erzeugen:

<form asp-controller="Home"
      asp-action="Contact"
      class="mainform">

</form>

Da dieser TagHelper das Anti Forgery Token auch gleich mit rendert, ist dieser zusätzliche Schutz ebenfalls auch gleich mit enthalten. Wie bei allen TagHelpern können benötigte HTML-Attribute beliebig gesetzt werden:

<form action="/Home/Contact" method="post" class="mainform">
 

    <input name="__RequestVerificationToken" type="hidden" value="[…]" />
</form>

Weiterhin gibt es noch Möglichkeiten die Route zu beeinflussen, 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"

Das oben genannte Anti Forgery Token kann mit asp-anti-forgery="false" abgestellt werden.

HTTP Sniffer Part 7: Integration in einen Windows Service

07.07.2015 01:54:00 | Jürgen Gutsch

Inhalt

Den Windows Service anlegen

Damit der Sniffer nicht in einer offen Console läuft und im Hintergrund auch für andere Benutzer laufen kann, sollte er als Windows Service angelegt werden.

Dafür wird ein Windows Service Projekt im Visual Studio ausgewählt. in Visual Studio 2015 RC versteckt sich das Template unter “Visual C#” -> “Windows” -> “Windows Desktop”

Start des Service

Die Service1.cs habe ich umbenannt in “CallProxy.cs” und erweitert, um Eventlogs in einer eigenen EventSource abzulegen:

public CallProxy()
{
    InitializeComponent();
    if (!EventLog.SourceExists("GOS"))
    {
        EventLog.CreateEventSource("GOS", "Proxy");
    }
    ServiceEventLog.Source = "GOS";
    ServiceEventLog.Log = "Proxy";
}

Der Proxy wird dann bei Onstart in einem eigenen Thread gestartet, der dann einfacher bei OnStop gekillt werden kann:

protected override void OnStart(string[] args)
{
    _thread = new Thread(Execute);
    _thread.Start();
}

private void Execute()
{
    var ip = Settings.Default.ListenIP;
    var port = Settings.Default.ListenPort;

    var proxy = new Proxy
    {
        ListenToIp = IPAddress.Parse(ip),
        ListenOnPort = port
    };

    proxy.Start();
}

protected override void OnStop()
{
    if (_thread != null)
    {
        _thread.Abort();
        _thread.Join();
    }
}

(Der Übersicht halber habe ich die Fehlerbehandlung und das Logging aus dem Beispiel-Code entfernt)

In der Methode Execute, in der der Proxy gestartet wird. passiert im Prinzip das gleiche wie auch in der Console Anwendung. Die Einstellungen bezüglich IP-Adresse und Port werden über die – in der App.Config gespeicherten – Settings geholt. Sobald der Proxy gestartet ist, läuft dieser, wie es in den vergangenen Beiträgen beschrieben ist.

Installation:

Damit der Service einfacher installiert werden kann ist auch die Program.cs. auf diese Art kann der Service bequem mit den Parametern –i/-install, bzw. –u/-uninstall installiert und deinstalliert werden. Ist dagegen kein Parameter angegeben, wird der Service ohne Installation gestartet (schaut euch dazu am besten die Sourcen auf Github an).

Microsoft gibt die Verfügbarkeit von Windows 10 Enterprise und Windows 10 Education bekannt

03.07.2015 11:23:44 | Mathias Gronau

Dass Windows 10 ab dem 29. Juli verfügbar sein wird ist ja nun bereits seit einiger Zeit bekannt. Heute hat Microsoft die Verfügbarkeit von Windows 10 Enterprise und Windows 10 Education angekündigt: Volumenlizenzkunden erhalten beide Versionen als Download im Volume Licensing Service Center (VLSC) beginnend ab dem 1. August 2015. Weitere Informationen hierzu finden Sie auf Blogging Windows. Windows 10 Enterprise für Volumenlizenzkunden ist die Erweiterung von Windows 10 Pro speziell für die Anforderungen großer Unternehmen. Erweiterte Sicherheitsfunktionen schützen vor modernen Angriffsszenarien. Es bietet den größten Funktionsumfang für die flexible Verwaltung des Betriebssystems, unterschiedlicher Geräte sowie Apps. Neben den Optionen im Rahmen von Windows Update for Business profitieren Unternehmenskunden darüber hinaus vom „Long Term Servicing Branch“ mit ausschließlich Sicherheitsupdates für mission critial devices in Unternehmen. Windows 10 Education basiert auf Windows 10 Enterprise und ist die Edition für Lehrer, Studenten und Mitarbeiter in Bildungseinrichtungen und verfügbar über das akademische Volumenlizenzprogramm.

Regeln | Impressum