2011 - DNC: REST Wars

Post on 31-Jul-2015

32 views 1 download

Transcript of 2011 - DNC: REST Wars

REST Warsdaniel.fisher@devcoach

.com

devcoach.comBERTAUNG + SCHULUNG + PROJEKTE

• Themen– Architektur & Technologie

Evaluierung, Performance Optimierung, Entwicklungs-Unterstützung, Security Reviews, QA, POC & Know-how-Transfer

• Technologien– Services: WCF & WF– Data: ADO.NET & EF– Web: ASP.NET, MVC & Silverlight

• Kunden– Versicherung, Finanzindustrie,

Mittelstand, Handel, Kommunikation, Softwarehersteller… Und sie?

• Kontakt– info@devcoach.com

Daniel Fisher• devcoach.com

– Mit-Gründer und Geschäftsführer

• Justcommunity.de– Mit-Gründer und Vorstand

• nrwconf.de– Mit-Gründer und Organisator

• netug-niederrhein.de– Mit-Gründer und Leiter

• microsoft.com– Community Leader & Insider (CLIP)– Certified Professional Developer– Business Platform Technology Advisor

• lennybacon.com– Blog

• twitter.com– @lennybacon

Efficient Communication…

Agenda

• Introducing REST• WCF WebHttp• ASP.NET MVC• WCF Web API• Summary

Introducing REST

Introducing REST

Windows Communication Foundation WebHttp

Unified Programming Model

Interopwith otherplatforms

ASMX

Attribute- Based

Programming

Enterprise Services

WS-*ProtocolSupport

WSE

Message-Oriented

Programming

System.Messaging

ExtensibilityLocation

transparency

.NET Remoting

WS-*

Security

Messaging

ReliableMessaging Transactions

Meta

data

XML

The Microsoft Web PlatformM

icro

soft

Web

Pla

tform

Vis

ual Stu

dioASP.NET Web

Forms

ADO.NET

SQL Server

Internet Information Services

ASP.NET MVC

Silverlight MsAjax jQuery

WCF

Address, Binding & Contract

Caller Service

MessageABC A B C

A B C

Address Binding Contract

(Where) (How) (What)

Address

public class Global : HttpApplication{ void Application_Start( object sender, EventArgs e) { RouteTable.Routes.Add( new ServiceRoute( string.Empty, new WebServiceHostFactory(), typeof(SessionPlanerService))); }}

Binding

<bindings> <basicHttpBinding> <binding configurationName="Binding1" hostNameComparisonMode="StrongWildcard" sendTimeout="00:10:00" maxMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" </binding> </basicHttpBinding></bindings>

Contract + Address (parts)

[ServiceContract]public interface ISessionPlaner{ [WebGet(UriTemplate = "Sessions")] List<SessionDetail> GetAllSessions();}

demo!

Automatic Format Selection

<system.serviceModel> <standardEndpoints> <webHttpEndpoint> <standardEndpoint name="" automaticFormatSelectionEnabled="true"> <security mode="None"/>

Extensibilitypublic class MyBehavior : WebHttpBehavior{}

public class MyClientFormatter : IClientMessageFormatter{}

public class MyDispatchFormatter : IDispatchMessageFormatter{}

public class MyEndpointBehavior : BehaviorExtensionElement , IEndpointBehavior{}

Extensibility<system.serviceModel> <behaviors> <endpointBehaviors> <behavior name="SomeName"> <myExtension /> </behavior> </endpointBehaviors> </behaviors> <services> <service name="Service"> <endpoint address="" binding="basicHttpBinding" contract="IService" behaviorConfiguration="SomeName"/> </service> </services> <extensions> <behaviorExtensions> <add name="myExtension" type="devcoach.ServiceModel.SomeEndpointBehavior, devcoach.ServiceModel, …"/> </behaviorExtensions> </extensions></system.serviceModel>

Extensibility Client<system.serviceModel> <behaviors> <endpointBehaviors> <behavior name="SomeName"> <myExtension /> </behavior> </endpointBehaviors> </behaviors> <client> <endpoint name="SomeEntpointName" address="" binding="basicHttpBinding" contract="IService" behaviorConfiguration="SomeName"/> </client> <extensions> <behaviorExtensions> <add name="myExtension" type="devcoach.ServiceModel.SomeEndpointBehavior, devcoach.ServiceModel, …"/> </behaviorExtensions> </extensions></system.serviceModel>

demo!

ASP.NET MVC

The Microsoft Web PlatformM

icro

soft

Web

Pla

tform

Vis

ual Stu

dioASP.NET Web

Forms

ADO.NET

SQL Server

Internet Information Services

ASP.NET MVC

Silverlight MsAjax jQuery

WCF

ASP.NET ArchitectureA

pplic

ati

on

Pool

ASP.

NE

T (

Htt

pR

unti

me)

HttpApplication Application_Start

Application_End

Application_Error

HttpContext

RequestModules

HttpHandler

Begin_Request

ResponseModules

Authenticate_Request

UpdateRequestCache

PostRequestHandlerExecuted

Kern

el C

ach

e

− The request hits the Controller.− The Model is loaded.− The View is provided with data and − renders markup to the

client.

Controller

Model

View

1

2

3

4

Uripublic static void RegisterRoutes(RouteCollection routes){    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");     routes.MapRoute(        "Default", // Route name        "{controller}/{action}/{id}", // URL with parameters        new            {                controller = "Home",  // if parameter not in URL                action = "Index",  // if parameter not in URL                id = UrlParameter.Optional            } // Parameter defaults    );}

Functionality

using System.Web.Mvc;

 …

public class HomeController : Controller

{ [HttpGet]

public ActionResult About()

{

return WhateverResult();

}

}

demo!

Extensibilitypublic class MyFilterAttribute

: ActionFilterAttribute

{

public override void OnActionExecuting(

ActionExecutingContext filterContext)

{

// Before...

}

 

public override void OnActionExecuted(

ActionExecutedContext filterContext)

{

// After...

}

Extensibilitypublic class ModelResult<T>  : ActionResult { public override void ExecuteResult( ControllerContext context) { var r = context.HttpContext.Response; r.Write(…); }}

demo!

Windows Communication Foundation WCF Web API

New Message Types

• HttpResponseMessage, JsonValue

demo!

Extensibility

public class MyFormatter : MediaTypeFormatter{}public class MyChannel : DelegatingChannel{}

Extensibilityprotected void Application_Start(object sender, EventArgs e){ var config = HttpHostConfiguration.Create(). AddFormatters(new MyFormatter()). AddMessageHandlers(typeof(MyChannel)); SetMappings();

RouteTable.Routes.MapServiceRoute<MyService>("Contact", config);}

public void SetMappings(){ var mappings = new List<UriExtensionMapping>(); mappings.AddMapping("xml", "application/xml"); SetUriExtensionMappings(mappings);}

demo!

Summary

• WCF 4.0 WebHTTP– Released with the .NET Framework.– Easy to start with REST, if you already

have WCF in the house.– Advanced goals can be reached,but with

high effort.– Distance to the Web can be felt.

Summary

• ASP.NET MVC– Version 3.0 released as separate

Product.– Easy to start with REST, if you know any

Web-Platform.– Advanced goals can be easily reached

with small effort.– It's the raw Web.

Summary

• WCF 4.0 WebAPIHTTP– Currently a Preview Release.– Easy to adopt from the WCF perspective.– Advanced goals can be reached, with

less high effort.– Still Abstracted from the web.

Resources

• WCF 4.0 WebHTTP– Part of the Platform

• http://www.microsoft.com/downloads/en/details.aspx?FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7

– Hotfix for jQuery• http://wcf.codeplex.com/

• ASP.NET MVC 3.0– Released Product

• http://www.asp.net/mvc

• WCF Web API– CTP 4

• http://wcf.codeplex.com/releases/view/64449

Q&A

Thank You

daniel.fisher@devcoach.com