WEB API 2.X
What’s new and …..
Head of Technolgies @ Gaia
Microsoft MVP, MCP
Blog (en): http://tostring.it
Blog (it): http://imperugo.tostring.it
• Who am I?
• What’s ASP.NET Web API?
• What’s a RESTfull service?;
• Routing old and new;
• Global Error Handling;
• Help Page;
• BSON serialization;
• Ignore route;
• …. caching;
Who am I?
• Head of Technologies at Gaia (www.gaia.is.it);
• Microsoft MVP (ASP.NET / ISS);
• Speaker / Trainer;
• Book / Article author;
• Github lover;
• Everything about Web Dev;
We are looking for
some good (and
crazy) guys to join our
Contact me –
Web API and REST
It is not a WebService (SOAP), a patter or a protocol,
but is a style of software architecture for distributed
systems such as the World Wide Web
Web API and REST
ASP.NET Web API is a framework (FW 4.x) for processing
data and returning data, tipically in json or xml (RESTful
It seems MVC but is not and, if you need both, use both.
What is similar to MVC?
• Released with NuGet;
• Controllers and Actions;
• Dependency Injection;
What is different from MVC?
• Dispatching (based on http verbs);
• Async everywhere;
• Self host (no need IIS);
• Content negotiation;
• Everything is under System.Web.Http;
• Stateless architecture based on HTTP;
• Each url is a resources (no transaction between two
• Base on HTTP Verbs (GET, POST, PUT, DELETE);
• The status of the response is based on HTTP Status code
(401, 200, 404 and so on);
Global error handling (the problem)
There’s no easy way in Web API to log or handle errors
globally (prev v2.x);
• Exceptions thrown from controller constructors
• Exceptions thrown from message handlers
• Exceptions thrown during routing
• Exceptions thrown during response content serialization
Good Article: http://bit.ly/1eiUvBB
Global error handling (the solution)
WEB API (2.x) provides two new user-replaceable services,
IExceptionLogger and IExceptionHandler, to log and
handle unhandled exceptions. The services are very
similar, with two main differences:
API Documentation (thx to @shanselman for that slide)
Is there someone who want to write the
API Documentation? (thx to @shanselman for that slide)
• “Automatic” API Documentation;
• Base on MVC (all via nuget);
• Template on top of Bootstrap
• Support validation attributes;
• Code comments;
• Support complex types also for GET Methods (new);
• Support for Enums;
CORS - Cross-Origin Resource Sharing -
By default it's not possible to make HTTP requests using
For example, this means that it's not possible to call the
URL http://mysite.com/api/myrestendpoint from a domain
This limitation has been introduced for security reasons: in
could get info from another site without noticing the user.
CORS (the problem)
Ok, but sometimes we need to do this. How can we do
• JSONP is easy to use and it's supported by all browsers;
the only problem is that the only HTTP VERB supported is
GET, which has a limitation on the lenght of the string that
can be passed as query parameter.
• Otherwise, if you need to send lot of information we can't
use this way, so the soulution could be to "proxy" the
request locally and forward the data server side or to use
CORS (the solution)
Basically CORS communication allow you to overtake the
problem by defining some rules that makes the request
Of course the first thing we need is a browser that support
CORS: fortunately all the latest browsers support it.
Anyway, we have to consider that, looking at the real world,
there are several clients that are still using Internet Explorer
8 which, among other things, doesn't support CORS.
CORS (the solution)
•Internet Explorer 10/11
•Chrome (all versions)
• Do you know the HTTP support caching?
• Do we really need to use server side cache?
• What I’ve to do in my code?
How does it work?
The client will ask the server if it has an updated copy of
the resource by sending some information about the
cached resources it holds using a request header
If there are no updates, the server return 304 with an empty
body, otherwise a 200 with the new data
It’s an open source library available on nuget (the source
code is on github) that allows you to enable caching in you
Support differents providers to store the cache (memcache,
ravendb, azure caching, Redis and so on);