Hide OData Metadata

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);

Hi @simon ,

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);
            });
}

1 Like