Slide 1

Slide 1 text

Christian Weyer | Thinktecture AG Für alle Leichtgewichtige Architekturen mit ASP.NET Web API & SignalR

Slide 2

Slide 2 text

Christian Weyer • Co-founder, co-owner and principal consultant at Thinktecture AG • Focus on – Mobile & web-based application architectures – Interoperability, cross-device – Pragmatic end-to-end solutions • Microsoft MVP for ASP.NET (Architecture) ASP.NET Web API / vNext Advisory Board Member ASPInsider, AzureInsider • Google GDE for AngularJS • http://blogs.thinktecture.com/cweyer christian.weyer@thinktecture.com @christianweyer 2

Slide 3

Slide 3 text

Architectures for… • Enterprise • ISV • Web • … any difference today? 3

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

5

Slide 6

Slide 6 text

Modern Business Applications Reach!

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

8

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

Web/HTTP APIs with ASP.NET Web API

Slide 11

Slide 11 text

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“ 11

Slide 12

Slide 12 text

Which one is ‚better‘? 12

Slide 13

Slide 13 text

Which one is more ‚polite‘? 13

Slide 14

Slide 14 text

14

Slide 15

Slide 15 text

Distributed Application Architectures for Modern Applications • Reach vs. rich • Base foundation vs. features • Light-weight vs. heavy-weight 15

Slide 16

Slide 16 text

16

Slide 17

Slide 17 text

HTTP – the Application Protocol • Application protocol • URIs • Verbs • Headers • Content types • Content negotiation • Status codes 17

Slide 18

Slide 18 text

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 18

Slide 19

Slide 19 text

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 – Actions expose explicit DTO data, HttpResponseMessage or JsonValue / dynamic 19

Slide 20

Slide 20 text

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 20

Slide 21

Slide 21 text

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 21

Slide 22

Slide 22 text

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 22

Slide 23

Slide 23 text

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 23

Slide 24

Slide 24 text

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 24

Slide 25

Slide 25 text

Push Services with ASP.NET SignalR

Slide 26

Slide 26 text

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] 26

Slide 27

Slide 27 text

Technical Approaches for Push • Periodic Polling • Long Polling – HTTP Streaming / Comet 27

Slide 28

Slide 28 text

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 28

Slide 29

Slide 29 text

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? 29

Slide 30

Slide 30 text

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 30

Slide 31

Slide 31 text

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 31

Slide 32

Slide 32 text

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 32

Slide 33

Slide 33 text

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 33

Slide 34

Slide 34 text

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); } 34

Slide 35

Slide 35 text

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 35

Slide 36

Slide 36 text

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’ 36

Slide 37

Slide 37 text

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()); 37

Slide 38

Slide 38 text

.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("newMessage", …); hubConnection.Start().Wait(); … 38

Slide 39

Slide 39 text

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 39

Slide 40

Slide 40 text

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 40

Slide 41

Slide 41 text

Resources • christian.weyer@thinktecture.com • 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 41