Hi,
I don't really like my OData metadata being exposed publicy. How can I hide it? I found a hint here so I started down the path of adding a convention in the OnConfigureOData partial class but don't quite understand how to add my convention to the route.
public partial class Startup
{
partial void OnConfigureOData(ODataConventionModelBuilder builder)
{
var defaultConventions = ODataRoutingConventions.CreateDefault();
var conventions = defaultConventions.Except(
defaultConventions.OfType<MetadataRoutingConvention>());
}
}
I am trying to implement something similar to the following without having to exclude startup.cs from code generation.
var defaultConventions = ODataRoutingConventions.CreateDefault();
var conventions = defaultConventions.Except(
defaultConventions.OfType<MetadataRoutingConvention>());
var route = config.MapODataServiceRoute(
"odata",
"odata",
model,
pathHandler: new DefaultODataPathHandler(),
routingConventions: conventions);
If you don't want to add Startup.cs to ignore list you will have to copy all code inside app.UseEndpoints and override it via the partial OnConfigure. Something like this:
partial void OnConfigure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
endpoints.MapControllers();
endpoints.MapFallbackToFile("index.html");
endpoints.Count().Filter().OrderBy().Expand().Select().MaxTop(null).SetTimeZoneInfo(TimeZoneInfo.Utc);
var oDataBuilder = new ODataConventionModelBuilder(provider);
oDataBuilder.EntitySet<CustomLandingPage.Models.Sample.Order>("Orders");
oDataBuilder.EntitySet<CustomLandingPage.Models.Sample.OrderDetail>("OrderDetails");
oDataBuilder.EntitySet<CustomLandingPage.Models.Sample.PersistedGrant>("PersistedGrants");
oDataBuilder.EntitySet<CustomLandingPage.Models.Sample.Product>("Products");
this.OnConfigureOData(oDataBuilder);
oDataBuilder.EntitySet<ApplicationUser>("ApplicationUsers");
var usersType = oDataBuilder.StructuralTypes.First(x => x.ClrType == typeof(ApplicationUser));
usersType.AddCollectionProperty(typeof(ApplicationUser).GetProperty("RoleNames"));
oDataBuilder.EntitySet<IdentityRole>("ApplicationRoles");
var model = oDataBuilder.GetEdmModel();
var defaultConventions = ODataRoutingConventions.CreateDefault();
var conventions = defaultConventions.Except(
defaultConventions.OfType<MetadataRoutingConvention>());
endpoints.MapODataRoute("odata", "odata/Sample", model, new DefaultODataPathHandler(), conventions);
endpoints.MapODataRoute("auth", "auth", model);
});
}