如何隐藏web api 2中的元数据,odata

时间:2014-09-09 14:42:52

标签: asp.net asp.net-mvc asp.net-web-api odata asp.net-web-api2

我已使用MapODataServiceRoute中的WebApiConfig定义了odata路线。

config.Routes.MapODataServiceRoute("CompanyoOdata", "odata", GetImplicitEdm(config));

private static IEdmModel GetImplicitEdm(HttpConfiguration config)
    {
        ODataModelBuilder builder = new ODataConventionModelBuilder(config, true);
        builder.EntitySet<Company>("Company");
        builder.EntitySet<Photo>("Photos");
        builder.EntitySet<Country>("Country");
        return builder.GetEdmModel();
    }

数据服务工作正常。但我想做的事情很少。

我不想暴露我的元数据或关联,因为我在内部使用它并且不需要元数据。如何限制对这些信息的访问(即限制对http://www.sample.com/odata/#metadatahttp://www.sample.com/odata/ $元数据的访问)

其次,我想忽略序列化的一些属性。我找到了两种方法。

  1. 使用数据合同并使用[DataMember]属性或[IgnoreDataMember]属性
  2. 标记属性
  3. 在构建模型时在Ignore上使用EntitySet方法
  4. 我无法使用第一种方法,因为我正在使用数据库第一种方法来实现实体框架,因此无法使用属性来装饰实体。我认为我可以使用MetaDataType来实现这一点,但它似乎只适用于DataAnnotations

    我成功使用了第二种方法,但是你不能在ignore方法中传递多个属性。必须对我需要忽略的个人财产这样做,这有点单调乏味。还有另一种方法吗?

    任何帮助都非常感激。

1 个答案:

答案 0 :(得分:10)

如果要隐藏元数据(/ $元数据)或服务文档(/),可以从现有路由约定中删除MetadataRoutingConvention,例如:

var defaultConventions = ODataRoutingConventions.CreateDefault();
var conventions = defaultConventions.Except(
    defaultConventions.OfType<MetadataRoutingConvention>());
var route = config.MapODataServiceRoute(
    "odata",
    "odata",
    model,
    pathHandler: new DefaultODataPathHandler(),
    routingConventions: conventions);

如果每种类型只显示一些属性,可以使用ODataModelBuilder而不是ODataConventionModelBuilder。例如,一些example

ODataModelBuilder builder = new ODataModelBuilder();
EntityTypeConfiguration<Customer> customer = builder.EntitySet<Customer>("Customers").EntityType;
customer.HasKey(c => c.Id);
customer.Property(c => c.Name);