Data services are a major building block inside a service oriented architecture. Not only do they provide the abstraction and isolation between physical storage systems and the business layer, they can also provide the means for: authentication, authorization, transformation, projection, scale (through for example sharding) and caching. This session will walk you through implementing your RESTfull data service so that you can easily enable and integrate the described capabilities
4. OData Value Proposition
• Problem Statement:
• There is no consistent data interoperability protocol for addressing
and manipulating enterprise data across various devices and
platforms
• Value Proposition:
• OData enables consistent REST-based data access from a variety
of back ends including relational databases, file systems, content
management systems, and traditional Web sites
• OData builds on widely-accepted standards like HTTP, JSON,
AtomPub, and URIs to address and access data
5. What OData Is and Is Not?
• What OData Is:
• Easy, consistent data access via HTTP endpoints
• REST-based data operations: CRUD, Filtering, Sorting, Paging,
Custom Operations, Delta, etc.
• Service centric data definition, operation and annotation
• Schematized and schema-less data sets
• Broadly accepted JSON/ATOM format on the wire
• What OData Is Not:
• Not to replace native or direct data access interface, e.g. ODBC/TDS
for SQL
• Not to replace highly specialized BI technologies like XMLA
6. OData Status
• OData v4 to be standardized in Feb. in OASIS
• http://docs.oasis-open.org/odata/new-in-odata/v4.0/cn01/new-in-odata-v4.0-
cn01.html
• ODL 6.2
• http://blogs.msdn.com/b/odatateam/archive/2014/04/14/odl-6-2-release-
announcement.aspx
• Web API OData 6.1
• http://blogs.msdn.com/b/odatateam/archive/2014/03/21/odata-6-1-and-odata-
client-6-1-are-now-shipped.aspx
• WCF Data Services moved to OSS
• http://blogs.msdn.com/b/odatateam/archive/2014/03/27/future-direction-of-wcf-
data-services.aspx
http://odata.org/
8. Technology Basics
Client Server
OData Service
OData
Protocol
Library
OData
Data
Model
Library
Data
Source
Technology .NET
OData Data Model Library Microsoft.odata.edm.dll
OData Protocol Library Microsoft.odata.core.dll
OData Service WCF Data Service/ Web API/ User’s own service
OData Client Library Microsoft.odata.client.dll
Code Generator T4 / item template
OData
Protocol
Library
OData
Data
Model
Library
OData Client
Library
OData
Protocol
Library
OData
Data
Model
Library
9. How to build client to consume
OData
Business Logic
Dev OData
Service
Metadata request
Use Code Generatror to generate client class
Client
Application
Account account = TestClientContext.Accounts.Where(account => account.AccountID
== 110).Single();
account.Country=”US”;
TestClientContext.UpdateObject(account);
TestClientContext.SaveChanges();
Code Files(Account.cs/
TestClientContext.cs)
Microsoft.odata.client.dll
The client dll will generate the request
based on the property change on the Account object
Get http://localhost:8080/OData/Accounts(110)
Patch http://localhost:8080/OData/Accounts(110)
11. OData Data Model Library
• OData is based on the Entity Data Model (EDM):
• EDM presents information in a way which is familiar to
many developers dealing with data today making it
easy for them to understand and use.
• Data provider can use OData Data Model Library to
create the EDM model of the data they want to
expose. The client can consume the data based on
the EDM model that exposed by service and figure
out the relationship between entities.
12. EDM Example
Entity Container
Entity set
(Categories)
Category
CategoryId Product
Entity set
(Products)
Product
ProductId Description
Navigation property binding
14. EDM Example – Cont.
• Category Entity:
• http://localhost/odata/Categories(1)
• Product under this category
• http://localhost/odata/Categories(1)/Product
• Through navigation binding defined in the Categories
and the navigation property defined in the Category,
target entity set Products can be found
• Entity product can be located in entity set Products
15. OData Protocol Library
• Deserialize/Serialize payload
• JSON
• Full metadata level
– {
– "@odata.context":"http://localhost:50671/ODataService.svc/OData/$metadata#Products/$entity",
– "@odata.id":"http://localhost:50671/ODataService.svc/OData/Products(5)",
– "@odata.editLink":"http://localhost:50671/ODataService.svc/OData/Products(5)",
– "ProductID":5,
– "Name":"Cheetos",
– "Description":"Cheese curl"
– }
• Minimal metadata level
– Writer only writes the necessary metadata
– Reader will auto complete the metadata during reading
– {
– "@odata.context":"http://localhost:50671/ODataService.svc/OData/$metadata#Products/$entity",
– "ProductID":5,
– "Name":"Cheetos",
– "Description":"Cheese curl"
– }
• No metadata level
– Data only
– {
– "ProductID":5,
– "Name":"Cheetos",
– "Description":"Cheese curl"
– }
• ATOM
16. OData Protocol Library
• Targeting the target resource based on the URI
• $top=n: Returns only the first n entities in an entity set (or in Atom terms,
the first n entries in a feed)
• $skip=n: Skips the first n entities in an entity set. Using this option lets a
client retrieve a series of distinct pages on subsequent requests
• $format: Determines whether data should be returned in JSON or the XML-
based Atom/AtomPub format
• $orderby=: Orders results, in ascending or descending order, by the value
of one or more properties in those results
• $filter=: Returns only entities that match the specified expression
• $select=: Returns only the specified properties in an entity
• $expand=: Returns the navigation property in an entity
URI Parser
17. OData Protocol Library – Cont.
• http://services.odata.org/V3/Northwind/Northwind.svc/Order_Details?$top=5
&$select=OrderID,ProductID&$skip=1&$filter=OrderID gt 10248
• Parsed result of request URI as an ODataUri object
• TopCount
• SkipCount
• SelectExpandClause
• List<SelectedItem>
– PathSelectionItem
» Path=OrderID
– PathSelectionItem
» Path=ProductID
• FilterClause
• FilterExpression
19. WebApi.OData: Overview
•An OData service library
•Build upon a lightweight http stack
•Be part of ASP.NET RESTful framework
•Selective query ability
•Another option to build OData service
20. Simple way to build OData Service
•No need to know the details of OData Protocol
•POCO (Plain Old CLR Object) model
•ODataConventionModelBuilder: 3 lines of code
var builder = new ODataConventionModelBuilder();
builder.EntitySet<Product>("Products");
IEdmModel model = builder.GetEdmModel();
•ODataController: VS2013 scaffolding
21. Web API OData Architecture Diagram
Message Handler
Controller Selection
ODataController
Action
Action Filter
MapODataRoute*GetEdmModelModel builderEdm Lib
Spatial Lib
Formatter
OData Lib
Serialize
Deserialize
Query
Entity Framework
DbContext
DbSet
Action Filter
Formatter Model Binder QueryOption
Action Selection
Type system
HttpRequestMessage
HttpResponseMessage
22. Components
• Model builder
• ODataModelBuilder
• ODataConventionModelBuilder (a 3 lines of code approach)
• Query
• ODL Semantic AST -> LINQ Expression (IQueryable) -> LINQ to * (Entities,
Objects…)
• Routing
• Conventional
• Attribute route
• Formatter
• Serializer: CLR type / typeless -> OData*Value
• Deserializer: OData*Value -> CLR type / typeless
23. Routing Examples
// Metadata routes to support $metadata and code generation in the
// WCF Data Service client.
configuration.Routes.MapHttpRoute(
ODataRouteNames.Metadata,
"$metadata",
new { Controller = "ODataMetadata", Action = "GetMetadata" }
);
configuration.Routes.MapHttpRoute(
ODataRouteNames.ServiceDocument,
"",
new { Controller = "ODataMetadata", Action = "GetServiceDocument" }
);
24. Routing Examples…
// Relationship routes (notice the parameters is {type}Id not id,
// this avoids colliding with GetById(id)).
// This code handles requests like ~/ProductFamilies(1)/Products
configuration.Routes.MapHttpRoute(
ODataRouteNames.PropertyNavigation,
"{controller}({parentId})/{navigationProperty}");
// Route for manipulating links, the code allows people to create and
// delete relationships between entities
configuration.Routes.MapHttpRoute(
ODataRouteNames.Link,
"{controller}({id})/$links/{navigationProperty}");
25. Routing Examples…
// Routes for urls both producing and handling URLs
// like: ~/Product(1), ~/Products() and ~/Products
configuration.Routes.MapHttpRoute(
ODataRouteNames.GetById,
"{controller}({id})");
configuration.Routes.MapHttpRoute(
ODataRouteNames.DefaultWithParentheses,
"{controller}()");
configuration.Routes.MapHttpRoute(
ODataRouteNames.Default,
"{controller}");
26. Model Builder
• ODataConventionModelBuilder
• Use reflection and conventions to generate an Edm model
• Reflection
• Type
• PropertyInfo
• MethodInfo
• Conventions
• AttributeConvention
• AttributeEdmTypeConvention: [DataContract]
• AttributeEdmPropertyConvention:
• [Key]
• [DataMember]
• [IgnoreDataMember]
• [Required]
• [ConcurrencyCheck]…
27. ODataModelBuilder
• Take full control
var builder = new ODataModelBuilder();
var products =
builder.EntitySet<Product>("Products");
var product = products.EntityType;
product.HasKey(p => p.ID);
product.Property(p => p.Name);
var rate = product.Action("Rate");
rate.Parameter<int>("Rating");
rate.Returns<double>();
• EntitySetConfiguration
• EntityTypeConfiguration
• PropertyConfiguration
• ProcedureConfiguration
• ParameterConfiguration
28. Query
• /Products/?$filter=Name eq ‘abc’
• One key differentiator than other Web API implementations
• QueryableAttribute
[Queryable]
public IQueryable<Product> GetProducts()
{
return db.Products;
}
• => ODataQueryOptions
public IEnumerable<Product> GetProducts(ODataQueryOptions options)
{
return options.ApplyTo(db.Products) as IEnumerable<Product>;
}
• FilterQueryOption -> FilterBinder:
• Convert OData AST FilterClause’s QueryNode to Linq Expression
30. Formatter
• Why does webapi.odata need to handle serialization and
deserialization?
• ODL handles OData object model to Payload
• Web API handles POCO to OData OM
• The hook:
[ODataFormatting]
public abstract class ODataController : ApiController
• ODataFormattingAttribute
• Inserts the ODataMediaTypeFormatters into the HttpControllerSettings.Formatters
collection.
• Attaches the request to the OData formatter instance.
• ODataMediaTypeFormatter.Create()
• ODataSerializerProvider / ODataDeserializerProvider
• OData*Serializer / OData*Deserializer
32. Laat ons weten wat u vindt van deze sessie! Vul de evaluatie
in via www.techdaysapp.nl en maak kans op een van de 20
prijzen*. Prijswinnaars worden bekend gemaakt via Twitter
(#TechDaysNL). Gebruik hiervoor de code op uw badge.
Let us know how you feel about this session! Give your
feedback via www.techdaysapp.nl and possibly win one of
the 20 prices*. Winners will be announced via Twitter
(#TechDaysNL). Use your personal code on your badge.
* Over de uitslag kan niet worden gecorrespondeerd, prijzen zijn voorbeelden – All results are final, prices are
examples