將我的專案更新到 .NET 6 并將 OData 更新到 8.0.4 后,出現了一個具有這些端點的新元資料控制器:

我想以某種方式禁用它或從我的服務中洗掉它。
添加OData服務的代碼:
ODataConfiguration.cs
public static void AddCustomOData(this IServiceCollection services)
{
services
.AddControllers(mvcOptions => mvcOptions.EnableEndpointRouting = false)
.AddOData(opt => opt.AddRouteComponents("", GetEdmModel()).Select().Expand());
}
為控制器創建自定義屬性 [EnableOData]:
public class EnableODataAttribute : EnableQueryAttribute
{
public override void ValidateQuery(HttpRequest request, ODataQueryOptions queryOptions)
{
try
{
queryOptions.Validate(new ODataValidationSettings());
}
catch (Exception e)
{
throw new ValidationException(e.Source, "Query parameter has not a valid value.");
}
}
}
版本:
- .NET 6
- ASP.NET 核心 6
- OData 8.0.4
uj5u.com熱心網友回復:
我最近遇到了類似的問題。我得到了解決方案
- 從啟動檔案中洗掉 odata 服務注入(因為如果我嘗試從啟動時注入 odata,swagger 會自動添加元資料類)
- 將 OData 從 8.0.4 降級到 8.0.0
- 并在控制器內部實作 ODataQueryOptions 而不是 EnableQuery actionfilter
- 在控制器中使用 ODataBuilder/OdataModelBuilder 而不是啟動。就我而言,它是 ODataBuilder

uj5u.com熱心網友回復:
如果您只需要從 Swagger 中隱藏元資料控制器和相關架構,請嘗試使用 DocumentFilter:
public class SwaggerODataControllerDocumentFilter : IDocumentFilter
{
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
// remove controller
foreach (ApiDescription apiDescription in context.ApiDescriptions)
{
var actionDescriptor = (ControllerActionDescriptor)apiDescription.ActionDescriptor;
if (actionDescriptor.ControllerName == "Metadata")
{
swaggerDoc.Paths.Remove($"/{apiDescription.RelativePath}");
}
}
// remove schemas
foreach ((string key, _) in swaggerDoc.Components.Schemas)
{
if (key.Contains("Edm") || key.Contains("OData"))
{
swaggerDoc.Components.Schemas.Remove(key);
}
}
}
}
將其添加到services.AddSwaggerGen:
cfg.DocumentFilter<SwaggerODataControllerDocumentFilter>();
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/391999.html
