HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected /...

31
HTML5 Knockout Web API SignalR Webstack of @bradwilson http://bradwilson.typepad.com/

Transcript of HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected /...

Page 1: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

HTML5

Knockout

Web API

SignalR

Webstack of ♥

@bradwilson http://bradwilson.typepad.com/

Page 2: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

UI Mockup from the “Designer”

Demo

Page 3: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

Model View View

Model

HTML

Markup

Business

Layer

Knockout

(Observables)

Page 4: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

<div>

Hello, <strong>Brad</strong>

</div>

Declarative

Page 5: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

<div>

Hello,

<strong data-bind="text: name" />

</div>

Declarative

Page 6: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

<ul>

<li>Item 1</li>

<li>Item 2</li>

<li>Item 3</li>

<ul>

Iterative

Page 7: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

<ul data-bind="foreach: items">

<li data-bind="text: name"></li>

<ul>

Iterative

Page 8: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

<input type="button" onclick="someJavaScript(thisObj)" />

Eventing

Page 9: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

<input type="button" data-bind="click: modelFunction" />

Eventing

Page 10: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

<div>

<span data-bind="text: buyer().firstName" />

<span data-bind="text: buyer().lastName" />

</div>

<div>

<span data-bind="text: seller().firstName" />

<span data-bind="text: seller().lastName" />

</div>

Templating

Page 11: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

<script type="text/html" id="fullName"> <span data-bind="text: firstName" /> <span data-bind="text: lastName" /> </script>

<div data-bind="template: { name='fullName', data: buyer }" />

<div data-bind="template: { name='fullName', data: seller }" />

Templating

Page 12: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

• View models with simple values are read once

• View models with observables get live updates

ko.observable(value)

ko.observableArray([...])

ko.computed(function() { ... })

ko.applyBindings(viewModel)

Observables

Page 13: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

Convert Mockup to Knockout

Demo

Page 14: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

ASP.NET Web API

MVC excels at processing form data and

returning HTML.

Web API excels at processing and returning

structured data like JSON or XML.

When you want to do both, use both.

Elevator Pitch

Page 15: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

ASP.NET Web API

• Routing

• Controllers and actions

• Filters

• Model binding

• Dependency injection support

Mix in a Little of the Old…

Page 16: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

ASP.NET Web API

• Dispatch based on HTTP verb

• Parameter binders

• Formatters

• Introspection

• Async from top to bottom (using Task<T>)

• Pluggable hosting layer

…With a Little of the New

Page 17: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

ASP.NET Web API

• HttpRequestMessage in

• HttpResponseMessage out

• HttpMessageHandler in-between

• No thread affinity, no static state*

Inspired by System.Net.Http

Page 18: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

ASP.NET Web API

Dispatch (Self Host)

HttpServer

Message Handlers Controller

Routing &

Controller Handler

Page 19: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

ASP.NET Web API

Dispatch (Self Host)

HttpServer

Message Handlers Controller

Routing &

Controller Handler

Page 20: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

ASP.NET Web API

Dispatch (Web Host)

“Global” Server

Message Handlers Controller

(Not Routing &)

Controller Handler

ASP.NET Routing

Page 21: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

ASP.NET Web API

http://aspnetwebstack.codeplex.com

• JSON.NET

• DotNetOpenAuth

• Tools, too: WiX, xUnit.net, Moq, StyleCop

Built as (and with) Open Source

Page 22: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

Add Web API for Persistence

Demo

Page 23: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

SignalR

• Web sockets

• Server-sent events

• Forever frames

• Long polling

Connection Mechanisms

Page 24: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

SignalR

• Persistent connections

– Send/receive discrete strings

• Hubs

– RPC-style messages

Server library: .NET

Client libraries: .NET, JavaScript, + others

Two levels of abstraction

Page 25: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

SignalR

• Connection events

– Connected / Reconnected

– Disconnected

• Information distribution

– Send to specific client

– Broadcast to all clients

Persistent Connection

Page 26: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

SignalR

public class MyHub : Hub {

public string Echo(string value) {

return value + "!";

}

}

Hubs (Server, inbound)

Page 27: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

SignalR

var hub = $.connection.myHub;

var result = hub.echo("value");

// result is "value!"

Hubs (client, outbound)

Page 28: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

SignalR

var hub = $.connection.myHub;

hub.sayItLoud = function(message) {

alert(message);

};

hub.tellAll("Hello, world!");

Hubs (client, inbound)

Page 29: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

SignalR

public class MyHub : Hub {

public void TellAll(string message) {

Clients.sayItLoud(message);

// Caller.sayItLoud(message);

// Clients[id].sayItLoud(message);

}

}

Hubs (server, outbound)

Page 30: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

Live Collaboration with SignalR

Demo

Page 31: HTML5 Knockout Web API SignalR - Brad Wilson · SignalR •Connection events –Connected / Reconnected –Disconnected •Information distribution –Send to specific client –Broadcast

Thank you!

github.com/bradwilson/WebstackOfLove

bradwilson.typepad.com/blog/talks.html

Webstack of ♥

@bradwilson http://bradwilson.typepad.com/