Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Leichtgewichtige Architekturen mit ASP.NET Web API und SignalR

Leichtgewichtige Architekturen mit ASP.NET Web API und SignalR

Die aktuellen Entwicklungen v. a. rund um mobile Anwendungen und Devices und Cloud-Computing bedeuten für viele Softwareprojekte ein Umdenken – vor allem in der Architektur. Wer das heute ignoriert, könnte sich morgen in Kalamitäten befinden. Wie bekomme ich eine leichtgewichtige Integration meiner Systeme mit interoperabler Kommunikation gestemmt? Wie kann ich Daten von meinen Services mittels Real-Time-Webkommunikation in meine Clients hinein pushen? In diesem Vortrag wird Christian Weyer aufzeigen, wie man diesen neuen Anforderungen architekturell begegnen kann. Dabei kommen Frameworks wie ASP.NET Web API, SignalR und passende Clientbibliotheken für .NET- und HTML5-/JavaScript-Clients zum Einsatz.

Christian Weyer

February 24, 2015
Tweet

More Decks by Christian Weyer

Other Decks in Programming

Transcript

  1. Christian Weyer • Solution architect and principal consultant at Thinktecture

    AG • Focus on – Mobile & web-based application architectures – Interoperability, cross-device – Pragmatic end-to-end solutions – Windows Server, ASP.NET, Web API, SignalR, JavaScript, AngularJS, Microsoft Azure • Microsoft MVP for ASP.NET (Architecture) • ASP.NET Web API / vNext Advisory Board Member • ASPInsider • AzureInsider • http://blogs.thinktecture.com/cweyer • [email protected] • @christianweyer 2
  2. 4

  3. 5

  4. Ubiquitous Access • .NET clients • Silverlight clients • Pure

    HTML(5) • JavaScript & jQuery • Android (Java) • iOS (Objective-C) • Embedded (C/C++) • Java • Any client, any device, actually 7
  5. Architectural Approaches to Service Orientation • „SOAP“ / WS-* –

    transport protocol independent – „secure, reliable and transacted“ (WS-*) – sophisticated and complex protocol stack – interoperability may become difficult – „the best RPC so far“ – „on the web, not of the web“ • Web/HTTP („REST“, anyone?) – fully embrace HTTP – least common denominator technologies – less functionality (KISS?) – reach and interoperability said to be better – „easier to use“ 9
  6. 12

  7. Distributed Application Architectures for Modern Applications • Reach vs. rich

    • Base foundation vs. features • Light-weight vs. heavy-weight 13
  8. 14

  9. HTTP – the Application Protocol • Application protocol • URIs

    • Verbs • Headers • Content types • Content negotiation • Status codes 15
  10. Web API Framework Requirements • Need a first class HTTP

    programming model • Easily map resources to URIs and implement the uniform interface • Rich support for formats and HTTP content negotiation • Separate out cross cutting concerns • Lightweight, Internet scale • Realize REST-ful or RPC-ish architectures – Being pragmatic, not idealistic 16
  11. Implementing a Web API • ASP.NET Web API technology stack

    – Based on OWIN • Derive from ApiController • Implement your actions – Actions map to HTTP methods – Prefix method name with desired HTTP method – e.g. PostComment – Use [HttpGet/Post/Put/Delete] if you prefer a different name – Supports async with Task<T> – Actions expose explicit DTO data, HttpResponseMessage or JsonValue / dynamic 17
  12. Hosting & Clients • Several hosting options, e.g. – ASP.NET

    Web Application (IIS) – Self-host server option (console application, Windows service, etc.) • HttpConfiguration defines behavior • OWIN as base for hosting Web API, SignalR etc. • HttpClient is a cross-.NET HTTP client API • JavaScript: jQuery’s $.ajax, or $http in AngularJS 18
  13. Routing • Maps a URL space to your Web API

    controllers – {controller} + “Controller” • Can be tailored using actions, default values and route constraints – Like more RPC-ish behavior • Alternative: attribute-based routing – Defines routes with .NET attributes 19
  14. Working with HTTP • “First class experience” for using HTTP

    – exposing HTTP as an application protocol in its full glory and not hiding it • Use of HttpRequestMessage and HttpResponseMessage – way of giving direct access to the HTTP protocol, without parsing and encoding complexity • Use IHttpActionResult – Better testability; pre-defined action results 20
  15. Model Binding & Formatters • Model binding can “shred” the

    request and bind it to individual parameters • Values are taken from the URL (route variables, query parameters) or from the body • MediaTypeFormatters are used to deserialize the request body based on the content type – XML, JSON, form-url-encoded supported out of the box • Request data is validated as it is bound to the parameters 21
  16. Content Negotiation • Response format is determined based on HTTP

    content negotiation • Request Accept header expresses desired format(s) • Server selects a format for the response based on the request and the available MediaTypeFormatters • Help/documentation page optionally available at /help • Use Swagger for open documentation standard 22
  17. Push Services Pattern • ‘Push Services’ are really not an

    official pattern – Observer pattern, anyone? • Model a service that – accepts incoming connections from callers – is able to push data down to callers – abstracts from communication nitty-gritty details • Realize Publish-Subscribe semantics – Based on standard web technologies with reach in mind – With maximum reach into any device, platform Push Service Consumer Send data External event (Database) External event (Message queue) External event (Other actor) Notify [data] 24
  18. Long Polling Poll but don’t respond untill there’s data •

    Server holds on to the HTTP request until there is data to return • (Re-)Poll after data received or after the connection times out • Consumes server threads & connection resources Server Client 26
  19. Technical Approaches for Push • Periodic Polling • Long Polling

    – HTTP Streaming / Comet • Forever Frame • Server-Sent Events (SSE) • Web Sockets • Easy: Web Sockets are the way to go! – Only with Windows 8/Server 2012 – Network considerations – Maybe some time, but not today • Alright, let’s just write code for any technology & technique! – Erm… really? For any server and any client platform? 27
  20. ASP.NET SignalR as a Solution • SignalR is – a

    server-side framework to write push services – a set of client libraries to make push service communication easy to use on any platform – optimized for asynchronous processing • Abstracts from the different techniques to implement pushing data – Mental model is a persistent connection – Volatile, non-durable • ‘Signal’, anyone? – Sending data to a signal. E.g. represented by a connection ID • Part of the ASP.NET brand, but not tied into ASP.NET runtime and APIs 28
  21. ASP.NET SignalR Development • Extensible framework & pipeline – Based

    on interfaces & DI • Two programming models – Persistent connections – Hubs • Hubs offer a pre-defined application-level protocol in an RPC-ish style – Easy-to-get-going means for 80/20 situations 29
  22. Hubs Concept • Hubs are classes to implement push services

    in SignalR – Abstraction on top of persistent connection – Convention-over-configuration • Hubs provide a higher level RPC framework – Perfect for different types of messages to send between server and client • Hub conventions – Public methods are callable from the outside – Send messages to clients by invoking client-side methods • Simple steps to get going 1. Write hub class 2. Add route in host process 3. Done 30
  23. Programming Model • Hub name reflected into external API –

    [HubName] can alias name • Return simple type, complex type or Task • Complex objects and arrays of objects automatically serialized/deserialized to/from JSON – Default is JSON.NET • Context holds connection- and request-specific information – ConnectionId – Request – Headers – RequestCookies – QueryString – User 31
  24. Pushing Data: Clients • Clients property as dispatching point to

    send messages to clients • Holds dynamic properties and methods • Target method with parameters is dynamically ‘injected’ into code path, serialized, and embedded into response public void SendMessage(string message) { var msg = string.Format("{0}: {1}", Context.ConnectionId, message); Clients.All.newMessage(msg); } 32
  25. Hub Consumers • Consumers can be classic client applications or

    other services/hubs • SignalR provides a variety of client libraries • Microsoft SignalR team – .NET 4.0+ – WinRT – Windows Phone 8 – Silverlight 5 – jQuery – C++ • Community – iOS native – iOS via Mono – Android via Mono 33
  26. jQuery Client • HTML5-based applications often use jQuery • JSON-based

    wire protocol makes it easy to integrate with JavaScript • SignalR jQuery plugin offers two approaches – Proxy-based with generated proxy – Without proxy but ‘late binding’ 34
  27. jQuery without Proxy File • Late binding approach • Simple

    steps to get going 1. Create hubConnection • Derived from $.connection 2. Get dynamic proxy 3. Wire up events based on method/event handler name via on 4. Start & invoke methods based on method name via invoke • Same connection-related event handlers • Cross-domain support same as with static proxy var connection = $.hubConnection(); var proxy = connection.createHubProxy('chat'); proxy.on('newMessage', onNewMessage); connection.start(); proxy.invoke('sendMessage', $('#message').val()); 35
  28. .NET Client • Client NuGet package contains binaries for all

    supported .NET flavors – .NET 4.x, SL5 – WP8, WinRT • Mental model resembles proxy-less JavaScript approach • Simple steps to get going 1. Create HubConnection 2. Create hub proxy via CreateHubProxy 3. Wire up event handlers via On 4. Start connection with Start 5. Call methods via Invoke var hubConnection = new HubConnection("http://localhost/services"); var chat = hubConnection.CreateHubProxy("chat"); chat.On<string>("newMessage", …); hubConnection.Start().Wait(); … 36
  29. Hosting • Hosting sits on top of OWIN – IAppBuilder

    API • Simple steps to get going 1. Define startup class with IAppBuilder method signature 2. Map hubs onto IAppBuilder (route) • In ASP.NET: Startup class used in WebApplication.Start to spin up server – HTTP or HTTPS base URL 37
  30. Summary • Flexible lightweight architectures – Based on the Web

    • Web APIs for exposing services with reach – ASP.NET Web API as lean technology stack • Push Services for implementing bi-directional communication – ASP.NET SignalR as enabling framework • Good base for a number of different application architectures – Web-based, native, Desktop, mobile 38
  31. Resources • [email protected] • http://www.thinktecture.com • Thinktecture’s GitHub Repositories –

    https://github.com/thinktecture • Christian Weyer’s GitHub Repositories – https://github.com/ChristianWeyer • ASP.NET Web API – http://www.asp.net/web-api • WebApiContrib – https://github.com/WebApiContrib • ASP.NET SignalR – http://www.asp.net/signalr 39