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– [email protected]
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