[英]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.