Oktober 2014

Volume 29 Number 10

Moderne Apps - Moderne Apps mit SignalR erstellen

Rachel Appel | Oktober 2014

Laden Sie die Codebeispiele herunter

Rachel AppelDa heute der Zugang zu Breitbandinternet fast überall möglich ist und drahtlose Geräte immer mehr Verwendung finden, ist die Nachfrage nach Apps, die in Echtzeit arbeiten, sehr groß. Beliebte Sites wie Facebook und Twitter, Multiplayerspiele und Apps für die Zusammenarbeit im Geschäftsleben bieten die beste User Experience (UX), wenn sie live und in Echtzeit funktionieren. Viele andere Typen von Apps sind ebenfalls für ein Nutzererlebnis in Echtzeit prädestiniert, wie z. B. Börsen- und Finanzen-Apps, Auktionen, Vertriebs-Dashboards, E-Commerce- und Bildungs-Apps. Selbst Websites und Apps, die nicht notwendigerweise von Live-Daten abhängen, können von der Vollduplexkommunikation in Echtzeit, die SignalR ermöglicht, profitieren.

Was ist SignalR, und warum sollte ich es verwenden?

SignalR ist ein Satz von Server- und Clientbibliotheken, die eine einfache bidirektionale Kommunikation in Echtzeit zwischen Server und Client ermöglichen. Nicht nur der Client kann den Kontakt mit dem Server initiieren, wie diese bei der Webentwicklung der Fall ist, sondern der Server kann auch den Client kontaktieren. Hierbei handelt es sich auch nicht nur um einfache HTTP-Antworten. Es sind richtige Methodenaufrufe vom Server zum Client, wie bei der Push-Technologie. Über die serverseitige Komponente von SignalR können Clients sogar andere Clients kontaktieren. Dies ist möglich, da SignalR eine dauerhafte Verbindung zwischen dem Server und Client herstellt.

Jeder möchte moderne Software erstellen, und moderner als Vollduplexkommunikation geht nicht. Mehrere Gründe sprechen für die Verwendung von SignalR. Die einfache Verwendung zum Schreiben von Websites und Apps ist einer der guten Gründe. Ein anderer guter Grund ist, wenn Sie Livekommunikation für Ihre Software benötigen. In diesen Fällen ist SignalR genau richtig für Sie. Sie könnten dies auch selbst mit einer Reihe verschiedener Techniken durchführen, wie z. B. WebSockets oder AJAX-Abruf. Sie müssten jedoch alle Grundlagen neu schreiben, was das SignalR-Team bereits für Sie erledigt hat. Diese Grundlagen sind sehr weitreichend und umfassen verschiedene Features:

  • Transportaushandlung: SignalR erkennt den besten Transport, um eine möglichst nahe Echtzeitkommunikation zu erzielen. Es verwendet standardmäßig WebSockets, da dies die schnellste und modernste Methode zum Schreiben von Echtzeit-Web-Apps ist. Hinter der Idee der Echtzeitkommunikation in SignalR steht die automatische Transportverwaltung. Beim Herstellen der Verbindung wird für jeden Client der Transport ausgehandelt.
  • SignalR-Serverhost: Sie können wählen, ob Sie ein standortunabhängiges, einfaches Selbsthosting, auch über andere Plattformen als Microsoft, verwenden möchten, oder ob Sie SignalR in die ISS-Pipeline integrieren möchten.
  • Clientseitige Bibliotheken: einschließlich JavaScript-, der Microsoft .NET Framework- und Windows Store-Bibliotheken.
  • JavaScript-Proxy: Bietet eine Möglichkeit zum Aufrufen von Methoden an Remotestandorten in JavaScript, während Sie die Entwicklung so durchführen können, als würde der gesamte Code in demselben Prozess auf demselben Computer ausgeführt.
  • Sicherheit: SignalR klinkt sich in vorhandene ASP.NET-Sicherheitsmodelle ein und unterstützt zahlreiche externe Sicherheitsanbieter, wie Microsoft Live, OpenAuth, Google, Facebook und Twitter.

Webentwickler schreiben Code herkömmlicherweise entsprechend dem Anforderungs-/Antwortmodell von HTTP. Daran ist eigentlich nichts auszusetzen, aber hierbei fehlt der primäre Vorteil von SignalR: eine dauerhafte Verbindung zwischen Server und Client. In HTTP stellen Sie eine Anforderung, bekommen eine Antwort, und fertig. In einem Echtzeitszenario bleibt die Pipeline zwischen dem Server und Client offen. Hierdurch können Sie reichere und bessere Benutzererlebnisse erstellen, die sich lebendig und verbunden anfühlen.

In SignalR gibt es zwei Abstraktionsstufen der Transporte auf niedriger Ebene: Hubs und dauerhafte Verbindungen. Um es kurz zu halten, befasst sich dieser Artikel nur mit Hubs. Hubs sind die allgemeine API, bei der es sich um den „total einfachen“ Teil von SignalR handelt. Es braucht mehr Zeit und Aufwand, dauerhafte Verbindungen im Code zu verfassen, und SignalR verwendet sie als Basis für Hubs. Sie verwenden Hubs in der Regel für die meisten Ihrer Aktivitäten, es sei denn, Sie haben gute Gründe, dies nicht zu tun.

Erste Schritte mit SignalR in Windows-Apps

Wie viele andere .NET-Bibliotheken wird SignalR als NuGet-Paket bereitgestellt. Sie können es mit dem NuGet-Paket-Manager oder der Paket-Manager-Konsole installieren. Beides sind Features von Visual Studio 2012 und Visual Studio 2013. Microsoft stellt zahlreiche verschiedene SignalR-Pakete bereit, darunter:

  • Microsoft ASP.NET SignalR: Das Basispaket, das Kern- und Webkomponenten mit dem JavaScript-Client installiert
  • Microsoft ASP.NET SignalR-Kernkomponenten: Hosting- und Kernbibliotheken
  • Microsoft ASP.NET SignalR System.Web: SignalR für ASP.NET
  • Microsoft ASP.NET SignalR JavaScript-Client: JavaScript-Clientbibliotheken für HTML-Apps
  • Microsoft ASP.NET SignalR .NET-Client: Clientbibliotheken für andere Windows-Plattform-Apps

Wenn Sie das Microsoft ASP.NET SignalR-Paket in einem Ihrer ASP.NET-Projekte (Web Forms oder MVC) installieren, installiert SignalR die Abhängigkeiten in jedem der aufgeführten Pakete, außer dem .NET-Client. Der .NET-Client ist für Windows 8- und Windows Phone-XAML-Apps, Windows Presentation Foundation (WPF), Windows Forms und Konsolen-Apps. Der NuGet-Paket-Manager enthält weitere SignalR-Pakete sowohl von Microsoft als auch von Drittanbietern. Diese decken so gut wie alles ab, einschließlich Selbsthosting, Skalierung, Abhängigkeitsinjektion und MongoDB-Unterstützung.

Nach der Installation müssen keine web.config-Einstellungen angepasst werden. Sie müssen jedoch ein kleines Snippet von Startcode hinzufügen, um ASP.NET anzuweisen, dass Sie SignalR in seine Pipeline einfügen:

[assembly: OwinStartup(typeof(VoteR.Startup))]
public partial class Startup
{
  public void Configuration(IAppBuilder app)
  {
    app.MapSignalR();
  }
}

Sie können diese Startklasse einer CS-Datei im App_Start-Ordner hinzufügen. Einige der ASP.NET-Projektvorlagen beinhalten bereits eine Startklasse für die ASP.NET-Formularauthentifizierung. Fügen Sie in diesem Fall stattdessen einfach die Konfigurationsmethode zu dieser Klasse hinzu. Anschließend können Sie mit dem Schreiben von Echtzeitcode weitermachen.

Diese Startklasse ist ein Open Web Interface für .NET (OWIN)-Startup. Dies bedeutet, dass es den OWIN-Spezifikationen entspricht. OWIN ist ein Standard ähnlich wie die Standards des Worldwide Web Consortium (W3C). Microsoft hat OWIN in einem Projekt mit der Bezeichnung „Katana“ implementiert. Dies ist das Modul hinter SignalR, das zusammen mit IIS arbeitet, oder als ein Selbsthost zur Unterstützung von bidirektionaler Kommunikation. Als SignalR-Entwickler, der Hubs verwendet, müssen Sie nicht mehr als dies über OWIN oder Katana wissen. SignalR kümmerst sich um diese Sachen, sodass Sie sich um die Lösung Ihrer Geschäftsprobleme mit SignalR konzentrieren können.

Die Serverseite von SignalR-Hubs

Hubs sind der Kern der Kommunikation in SignalR. Sie erhalten eingehende Anforderungen und leiten Nachrichten an die Clients weiter, entweder vom Hub selbst oder im Auftrag eines anderen Clients. Sie können einen Hub in SignalR wie eine Nabe und die Speichen eines Rads betrachten.

Der Hub ist wie ein Gatekeeper für die Nachrichten. Während diese sich im Mittelpunkt der Aktion befinden, sind Hubs nur Klassen, die von der Microsoft.AspNet.SignalR.Hub-Klasse erben. Die Hubklasse wiederum implementiert die IHub-Schnittstelle des Microsoft.AspNet.SignalR.Hubs-Namespace. Die IHub-Schnittstelle definiert drei Ereignisse: OnConnected, OnDisconnected und OnReconnected. Sie definiert außerdem drei Eigenschaften: Clients, Context und Groups. Hierbei handelt es sich um allgemeine Aufgaben oder Informationen, die sich auf die einzelnen Echtzeitverbindungen zum Hub beziehen.

Der Client ruft öffentliche Methoden auf dem Hub auf, was bedeutet, dass der Code wie ein Webdienstaufruf aussieht. SignalR-Hubs können jedoch den Kontakt mit solchen Clients initiieren, die sich bei den Hubs registriert haben. Sie programmieren in der Regel nicht mit dieser Art von Verhalten im Hinterkopf, da Sie normalerweise das herkömmliche Anforderungs-/Antwortmodell verwenden.

Dies kann aufgrund der Clients-Eigenschaft passieren, die eine Auflistung aller verbundenen Clients darstellt. Über die Clients-Eigenschaft können Sie unabhängig von der Plattform auf einen oder mehrere Clients zugreifen. So kann zum Beispiel ein iOS-Client über den Hub eine Nachricht an einen Windows-Client senden, da der Hub im Auftrag des iOS-Clients mit dem Windows-Client kommuniziert und umgekehrt.

Um den Hub in Aktion zu demonstrieren, verwende ich hier eine Beispiel-App mit dem Namen „VoteR“, mit der eine Reihe von Elementen angezeigt wird und die Benutzer für ihren Favoriten abstimmen können. Im Kern der App ist eine VoteHub-Klasse. Dies ist der Hub, der die Stimmen der Benutzer für die einzelnen Elemente nachzählt. Er unterrichtet die Clients dann über die aktuellen Zahlen. Abbildung 1 zeigt ein Beispiel für die VoteHub-Klasse.

Abbildung 1 Die VoteHub-Klasse zählt die Stimmen

public class VoteHub : Hub
{
  private static List<Item> VoteItems = new List<Item>();
  private static VoteRContext db = new VoteRContext();
  public void Vote(int id)
  {  
    var votes = AddVote(id);
    Clients.All.updateVoteResults(id, votes);
  }
  private static Item AddVote(int id) {
    var voteItem = VoteItems.Find(v => v.Id == id);       
    if (voteItem != null)
    {
      voteItem.Votes++;
      return voteItem;
    }
    else
    {
      var item = db.Items.Find(id);
      item.Votes++;
      VoteItems.Add(item);
      return item;  
    }       
  }
  public override Task OnConnected()
  {       
    Clients.Caller.joinVoting(VoteItems.ToList());
    return base.OnConnected();
  }
}

Die beiden in Abbildung 1 zu untersuchenden Methoden sind die Vote- und Add­Vote-Methoden. Die Vote-Methode ist die, die die Clients aufrufen (im nächsten Abschnitt erläutert). Die App ruft dann die private AddVote-Methode auf, die die eigentliche Stimmenzählung durchführt. Hierzu überprüft sie, ob sich in der VoteItems-Liste bereits Elemente befinden. Wenn dies der Fall ist, aktualisiert sie diese. Wenn nicht, fügt die AddVote-Methode das Element hinzu, sobald ein Benutzer das erste Mal dafür abstimmt. Die statische List<Vote> ist eine einfache Möglichkeit zum speichern einfacher globaler Informationen wie diese, ohne dass eine Datenbank benötigt wird.

Die Vote-Methode in Abbildung 1 enthält eine interessante Codezeile nach dem Aufruf von AddVote:

Clients.All.updateVoteResults(id, votes);

In SignalR verwenden Sie die Clients-Eigenschaft, um auf Code im Client zuzugreifen und ihn aufzurufen. Über die Clients-Eigenschaft können Sie auf die Clients abzielen, auf die Sie zugreifen möchten. In einigen Fällen sind das alle Clients, wenn zum Beispiele eine neue Abstimmung läuft. Manchmal ist es nur ein Client, wenn ein Benutzer zum Beispiel erstmalig die Verbindung herstellt. Durch die Verwendung von Benennungskonventionen kann SignalR den Serveraufruf mit dem Code auf dem Client, der ausgeführt werden soll, abgleichen. Dies ist das erste Mal in der Geschichte von ASP.NET, dass Sie dynamische Eigenschaften zum Aufrufen von Code auf dem Client verwenden können.

Da VoteHub die Abstimmungen nachhalten muss, können Sie sich denken, dass es sinnvoll ist, ein Ereignis wie OnConnected zu haben. Mit dem OnConnected-Ereignis können Sie neue, eingehende Verbindungen erfassen. Ein wahrscheinliches Szenario ist, dass die ID der Verbindung durch die ConnectionId-Eigenschaft des Context-Objekts erfasst wird.

Im Falle der VoteR-App in Abbildung 1 durchläuft diese die drei Elemente im VoteHub List<Item>-Objekt und informiert den Client über die Clients.caller-Eigenschaft darüber, wie viele Stimmen jedes Element hat. Auf diese Weise verfügen neu verbundene Clients sofort über die Gesamtzahl der Stimmen für die einzelnen Elemente, nachdem sie der Partei beitreten.

Es gibt noch zahlreiche andere Möglichkeiten für die Kommunikation zwischen Server und Client. Die Clients-Eigenschaft der Hub-Klasse legt die vielen verschiedenen Möglichkeiten zum Zugreifen auf den Clientcode offen, wie in Abbildung 2 dargestellt.

Abbildung 2 Verschiedene Möglichkeiten der Kommunikation zwischen Server und Client

// Call method on all clients
Clients.All.clientSideMethod(args, args, ...);
// Call method on specific client       
Clients.Client(Context.ConnectionId). clientSideMethod(args, args, ...);
// Call a method on a list of specific connections
Clients.Clients(ConnectionId1, ConnectionId1, ...).clientSideMethod(args, args, ...);
// Call method on calling connection
Clients.Caller.clientSideMethod(args, args, ...);
// Call method on all clients but the caller
Clients.Others. clientSideMethod(args, args, ...);
// Call method on all in the group except a few select connections
Clients.AllExcept(connectionId1, connectionId2).clientSideMethod(args, args, ...);
// Call method on groups of connections
Clients.Group(groupName).clientSideMethod(args, args, ...);
// Call method on connected clients in a specified group
Clients.Groups(GroupIds).clientSideMethod(args, args, ...);
// Call method on other connected clients in a specified group
Clients.OthersInGroup(groupName).clientSideMethod(args, args, ...);

In Abbildung 2 ist die clientSideMethod auf dem Client definiert, den der Server aufruft. Im nächsten Abschnitt erfahren Sie, wie Sie diese Methoden auf dem Client definieren können. Wie Sie sehen können, ermöglicht Ihnen die dynamische Charakteristik der Clients-Eigenschaft, Code für umfassende Szenarien der Server-Client-Kommunikation zu schreiben.

Die Client-Seite von SignalR: JavaScript- und .NET-Clients

Mit SignalR können Sie auf jeder Plattform Echtzeit-Apps erstellen. Sie können den JavaScript-Client von SignalR ohne jede weitere Konfiguration für alle Arten von Web- und HTML-Client-Apps verwenden, einschließlich WinJS-Apps. Normales HTML und JavaScript sind weit verbreitete Sprachen. Für die Anhänger von .NET hat Microsoft einen .NET-Client für Windows- und Desktop-Apps veröffentlicht. Wie die Kernkomponenten auch, installieren Sie entweder den JavaScript- oder .NET-Client von NuGet, je nachdem, welche Art von Projekt Sie planen. Da JavaScript einfach nur JavaScript ist, können Sie die Scripts von github.com/SignalR/SignalR herunterladen und Ihrer Seite <script> -Tags hinzufügen, anstatt .dll-Dateien referenzieren zu müssen, wie hier dargestellt:

<script src="~/Scripts/jquery-1.10.2.js"></script>
<script src="~/Scripts/jquery.signalR-2.0.3.js"></script>
<script src="~/signalr/hubs"></script>

Die Reihenfolge der Scriptverweise ist wichtig. Sie müssen jQuery zuerst laden, da SignalR davon abhängt. Als Nächstes kommt der SignalR-Client. Zuletzt ist der SignalR-Proxy dran. SignalR erstellt einen Proxy dynamisch zur Laufzeit und lässt ihn bei /signalr/hubs fallen. Dieser Proxy ist es, der Ihnen ermöglicht, Code sowohl auf dem Client als auch dem Server zu schreiben, wobei er sich so verhält, als befände er sich an demselben Ort.

Das Client-Script der VoteR-App definiert Methoden zum Empfangen von Aufrufen des Servers sowie normale Methoden und Ereignisverknüpfungen. In Abbildung 3 isoliert die erste Codeziele die Variable „voteHub“. Die ist eine direkte Verbindung zu einer Instanz der VoteHub-Klasse. SignalR erstellt eine Instanz des Hubs für jeden Client, der eine Verbindung herstellt. Der Client startet die Verbindung mit einem Aufruf von $.conne­ction.hub.start, die ein Promise zurückgibt. Dies bedeutet, dass der enthaltene Code erst ausgeführt wird, wenn er vollständig ist. In diesem Fall ist es ein Aufruf der Vote-Methode auf dem Server innerhalb des Klickereignisses für die Abstimmungsschaltfläche. Wie Sie sehen können, übergibt sie die vom Benutzer gewählte Element-ID an den Server. Der Server führt dann die in Abbildung 1 dargestellten Aufgaben durch.

Abbildung 3 JavaScript-Clientcode

$(function () {
  var voteHub = $.connection.voteHub;
  $.connection.hub.start().done(function () {
    $("button").click(function () {
      voteHub.server.vote(this.id);
        });
  });
  voteHub.client.updateVoteResults = function (id, vote) {
    // Update UI to show each item and how many votes it has
    }
  voteHub.client.joinVoting = function (votes) {
    // Cycle through votes to display current information
    // about each item to newcomer
  }   
});

An diesem Punkt denken Sie möglicherweise, dass in Abbildung 3 Schreibfehler vorliegen. Dies ist der Fall, da die Benennung der VoteHub-Klasse und der Vote-Methode zwischen dem Server und dem Client inkonsistent ist. Das ist kein Schreibfehler, sondern eine Konvention von SignalR. Bei JavaScript-Clients sind Aufrufe von hub.server.methodName standardmäßig camelCase. Dieses Verhalten lässt sich einfach ändern, indem Sie das HubName-Attribut mit der gewünschten Großschreibung an die Hub-Klasse anhängen. Das HubName-Attribut sieht so aus: HubName(„VoteHub“).

Die beiden interessantesten Codeteile in Abbildung 3 sind die voteHub.client.updateVoteResults- und voteHub.client.joinVoting-Blöcke. Wie ihre Signaturen angeben, sind beide Methoden Mitglieder er Client-Eigenschaft von VoteHub auf dem Server. Denken wir zurück an Abbildung 1: Die clientseitige voteHub.client.updateVoteResults-Methode aus Abbildung 3 ist am Clients.All.update­VoteResults(id, votes)-Aufruf aus Abbildung 1 ausgerichtet. Abbildung 4 zeigt die Beziehung zwischen dem Server- und dem Clientcode.

Die Beziehung zwischen den Hub- und Client-Methodenaufrufen
Abbildung 4 Die Beziehung zwischen den Hub- und Client-Methodenaufrufen

Jetzt wird es Zeit, dass wir uns den .NET-Client ansehen. In Abbildung 5 ist Code dargestellt, der eine Verbindung von einer Windows Store-XAML-App mithilfe von C# herstellt. Dies könnte genauso gut eine Windows Phone-App sein, der Code ist identisch. Er beginnt damit, dass er eine Verbindung zur SignalR-Pipeline herstellt. Dann erstellt er den Proxy.

In Abbildung 5 sehen Sie etwas, das Sie normalerweise nicht im JavaScript-Client sehen würden: und zwar den HTTP-Pfad zur SignalR-Pipeline, der in den HubConnection-Konstruktor übergeben wird. Im Gegensatz zum JavaScript-Client ist dies etwas weniger automatisiert. Sie müssen eine HubConnection instanziieren und CreateHubProxy aufrufen, um den Proxy zu erstellen.

Abbildung 5 Windows Store-Clientcode in C# zum Abstimmen in VoteR

async private Task startConnection()
{
  var hubConnection = new HubConnection("http://localhost:25024/signalr");
  IHubProxy hubProxy = hubConnection.CreateHubProxy("VoteHub");
  var context = SynchronizationContext.Current;
  hubProxy.On<string, string>("updateVoteResults", (id, votes) =>
    context.Post(delegate {
  // Update UI
); }, null));                        
  await hubConnection.Start();
  await hubProxy.Invoke("vote", "rachel", 
    Convert.ToDecimal(itemId.Text));
}

Beachten Sie, dass in Abbildung 5 eine Zuweisung vorhanden ist, die einen Synchronisierungskontext abruft. Sie umschließen den Clientcode, den der Server aufruft, mit diesem Kontextobjekt. Dann rufen Sie die Post-Methode auf und übergeben einen Delegaten. Delegaten in C# sind identisch mit anonymen Inlinefunktionen in JavaScript.

Nachdem Sie die Verbindung des Hubs gestartet haben, können Sie die Invoke-Methode seines Proxys aufrufen, um für ein Element abzustimmen. Wenn Sie das await-Schlüsselwort verwenden, werden diese Aktionen asynchron durchgeführt. Hier finden Sie den vollständigen Quellcode für die VoteR-Demo-App: github.com/rachelappel/VoteR.

SignalR-Bereitstellung: Server und Client

Da es sich bei SignalR um ASP.NET handelt, müssen Sie die Bereitstellung in einer Umgebung mit .NET Framework 4.5 oder höher vornehmen, es sei den, Sie verwenden Selbst-Hosting. In einem ASP.NET-Projekt ist SignalR nur ein Satz von Bibliotheken. Zum Zeitpunkt der Bereitstellung wird es wie die anderen Bibliotheken bereitgestellt.

Wenn Sie meinen, der Rest von SignalR ist einfach, warten Sie erst einmal ab, bis Sie Microsoft Azure bereitstellen möchten. Mit Azure wird der Bereitstellungsvorgang noch einmal besonders stressfrei. Hierbei wird sowohl die SignalR-Serverkomponenten als auch mindestens ein HTML-Client auf einem Webserver bereitgestellt. Sie müssen natürlich alle Windows Store- oder Windows Phone-Apps im App Store sowie Desktop-Apps über die entsprechenden Kanäle auf den Desktops veröffentlichen.

Diejenigen, die ASP.NET-Projekte verwenden, können im Visual Studio-Build-Menü die Option Veröffentlichen wählen, um die Bereitstellung in Azure zu starten. Wenn Sie Visual Studio 2013 verwenden, folgen Sie einfach den Aufforderungen. Sie müssen nur Ihre Anmeldedaten eingeben und die Datenbank sowie den Websitenamen wählen.

In Visual Studio 2012 sind die Aufforderungen ähnlich. Während der Bereitstellung können Sie wählen, ob eine neue Azure-Website erstellt werden soll oder ob Sie eine vorhandene verwenden möchten. Wenn Sie eine vorhandene Site verwenden möchten, melden Sie sich beim Azure-Portal an, navigieren Sie zur Registerkarte „Konfiguration“, und aktivieren Sie WebSockets. Bei einer neuen Website müsse Sie ebenfalls so vorgehen, wobei Visual Studio die Site zuerst erstellt und startet, was zu einem Fehler führt. Melden Sie sich wiederum an und aktivieren Sie WebSockets. Das ist wichtig! Es ist immer angeraten, Websites nach einer Konfigurationsänderung zu stoppen und wieder zu starten.

Zusammenfassung

SignalR ermöglicht die einfache Echtzeit-Programmierung. Obwohl es sich um ein ASP.NET-Produkt handelt, kann es plattformübergreifend verwendet werden, da Sie Windows Store-, iOS- und Android-Apps mit einer ASP.NET-Serverkomponente schreiben können. Wenn Sie für andere Betriebssysteme als die von Microsoft entwickeln, können Sie auch Selbst-Hosting anwenden. SignalR ist daher nicht nur einfach und effizient, sondern auch flexibel. Eine andere tolle Sache bei SignalR ist auch, dass Sie noch nicht einmal Echtzeitfunktionen als Voraussetzung brauchen. Nutzen Sie es für künftige Projekte und werden Sie Teil der großen Programmierergemeinschaft, die das Paradigma der Echtzeitprogrammierung schon übernommen haben.


Rachel Appel ist Beraterin, Autorin, Mentorin und frühere Microsoft-Mitarbeiterin mit über zwanzigjähriger Erfahrung in der IT-Branche. Sie nimmt an wichtigen Branchenkonferenzen wie Visual Studio Live!, DevConnections und MIX als Rednerin teil. Ihr Fachbereich ist die Entwicklung von Lösungen, bei denen geschäftliche und technologische Aspekte in Einklang gebracht werden und in denen führende Microsoft- und offene Webtechnologien zum Einsatz kommen. Besuchen Sie Rachel Appel auf ihrer Website unter rachelappel.com.

Unser Dank gilt dem folgenden technischen Experten von Microsoft für die Durchsicht dieses Artikels: Frank La Vigne