OData urls can contain edm primitives. The string representation of these primitives is different than what webapi (and .NET) uses causing model binding errors.
For example, the url "http://localhost/Products('Microsoft Windows ')" with the route template "/Products({name})" is expected to map to the action, "Product Get(string name) { ... }".
Similarly, "http://localhost/Products(guid'12345678-aaaa-bbbb-cccc-ddddeeeeffff') with route template "/Products({id})" is expected to map to the action, "Product Get(Guid id)".
We have to add a parameter binder that understands odata literals and does the model binding appropriately.
For example, the url "http://localhost/Products('Microsoft Windows ')" with the route template "/Products({name})" is expected to map to the action, "Product Get(string name) { ... }".
Similarly, "http://localhost/Products(guid'12345678-aaaa-bbbb-cccc-ddddeeeeffff') with route template "/Products({id})" is expected to map to the action, "Product Get(Guid id)".
We have to add a parameter binder that understands odata literals and does the model binding appropriately.