簡體   English   中英

從 $metadata 端點移除 OData 實體集

[英]Remove OData entity sets from $metadata endpoint

我有一個構建為 .NET 5 web api 的 OData 服務,它公開了系統不同部分的實體類型和集合——一個用於內部數據導出的公共部分和一個“私有”。

其中一些實體集用於“私人”部分,尚未(或永遠不會)准備好公開發布。 我已將它們從 Swagger 中排除,用戶在嘗試使用服務公共部分中使用的身份驗證訪問它時會得到 404。

我的問題是 $metadata 端點返回有關所有實體集的描述。 因此,當公共用戶訪問服務時,它會看到它不應該看到的實體。

有沒有辦法從 $metadata 中排除特定的實體集?

我嘗試覆蓋 ODataMetadataSerializer 以排除不需要的架構元素,但它不允許在生成響應之前操作 EDM model。

您可以按照 github 上的示例動態注冊 EDM model

DynamicEdmModelCreation 示例對我的情況來說太復雜了,我是否只需要排除一些實體集(如您的情況),所以我只更改了 static EdmModel 的一件事:只需調用MapODataRoute 方法,該方法使用IContainerBuilder而不是接收委托預先創建的IEdmModel

這是我如何使用它的示例:

endpointBuilder.MapODataRoute ("odata", "odata/datasource/{dataSourceId:guid}/", builder =>
{
    builder
        .AddService (Microsoft.OData.ServiceLifetime.Scoped, provider =>
        {
            var serviceScope = provider.GetRequiredService<HttpRequestScope> ();
            return CreateMyEdmModelDynamicallyForRequest (serviceScope);
        })
        .AddService<IEnumerable<IODataRoutingConvention>> (Microsoft.OData.ServiceLifetime.Singleton, provider =>
            ODataRoutingConventions.CreateDefaultWithAttributeRouting ("odata", endpointBuilder.ServiceProvider));
});

添加IEnumerable<IODataRoutingConvention>是必要的,因為這是MapODataRoute使用IEdmModel參數重載的功能。 如果沒有它,我無法解析元數據端點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM