7.1.7 Configurando OData en el archivo Startup.cs

En nuestro archivo Startup.cs en el método ConfigureServices agregamos el siguiente código para configurar OData

Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options=>
{
options.Filters.Add(typeof(CustomExceptionFilter));
foreach (var formatter in options.OutputFormatters
.OfType<ODataOutputFormatter>()
.Where(it => !it.SupportedMediaTypes.Any()))
{
formatter.SupportedMediaTypes.Add(
new MediaTypeHeaderValue
("application/prs.mock-odata"));
}
foreach (var formatter in options.InputFormatters
.OfType<ODataInputFormatter>()
.Where(it => !it.SupportedMediaTypes.Any()))
{
formatter.SupportedMediaTypes.Add(
new MediaTypeHeaderValue
("application/prs.mock-odata"));
}
}
services.AddOData();
services.AddMvcCore(options =>
{
foreach (var outputFormatter in
options.OutputFormatters.OfType<ODataOutputFormatter>()
.Where(_ => _.SupportedMediaTypes.Count == 0))
{
outputFormatter.SupportedMediaTypes.Add(
new Microsoft.Net.Http.Headers
.MediaTypeHeaderValue(
"application/prs.odatatestxx-odata"));
}
foreach (var inputFormatter in options.InputFormatters
.OfType<ODataInputFormatter>().Where
(_ => _.SupportedMediaTypes.Count == 0))
{
inputFormatter.SupportedMediaTypes.Add(
new Microsoft.Net.Http.Headers.MediaTypeHeaderValue(
"application/prs.odatatestxx-odata"));
}
});
}

Vamos a registrar las rutas mediante las cuales van a ser accesados nuestros servicios, nuevamente en nuestro archivo Startup ahora en el método Configure agregamos la ruta odata para todos los modelos que registremos como EDM, permitimos tambien que los servicios permitan filtrado, order by, seleccinar solamente unos campos

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseMvc(routeBuilder =>
{
routeBuilder.Select().Expand().Filter()
.OrderBy().MaxTop(100).Count();
routeBuilder.MapODataServiceRoute(
"odata", "odata", GetEdmModel());
routeBuilder.EnableDependencyInjection();
});
}
private static IEdmModel GetEdmModel()
{
ODataConventionModelBuilder builder = new
ODataConventionModelBuilder();
builder.EntitySet<Cliente>("Clientes");
builder.EntitySet<ClienteCategoria>("ClientesCategorias");
builder.EntitySet<Caducidad>("Caducidad");
return builder.GetEdmModel();
}

Si corremos nuestro proyecto veremos un error en el swagger el cual corregiremos mas adelante, vamos a probar con postman los metadatos de nuestro servicio GET http://localhost:50685/odata/$metadata