C# ApiExplorer:如何更改IgnoreApi的默认值
我们有几个C# ApiExplorer:如何更改IgnoreApi的默认值,c#,asp.net-web-api,asp.net-apicontroller,C#,Asp.net Web Api,Asp.net Apicontroller,我们有几个ApiController实现,我们不希望大多数操作包含在ApiExplorer的元数据中 默认情况下,如果未将[ApiExplorerSettings(IgnoreApi=true)]添加到操作中,则将添加它,因此这意味着默认值为false 这可能是因为IgnoreApi是一个布尔值,默认值为false,但是如何将此默认值更改为true,而不必重写ApiExplorerSettings 这是一个基本的WebApi实现,不使用MVC组件 我试着四处寻找简单的基于配置的解决方案或apip
ApiController
实现,我们不希望大多数操作包含在ApiExplorer的元数据中
默认情况下,如果未将[ApiExplorerSettings(IgnoreApi=true)]
添加到操作中,则将添加它,因此这意味着默认值为false
这可能是因为IgnoreApi
是一个布尔值,默认值为false
,但是如何将此默认值更改为true
,而不必重写ApiExplorerSettings
这是一个基本的WebApi实现,不使用MVC组件
我试着四处寻找简单的基于配置的解决方案或apipexplorersettings
用法示例,但没有一个真正适合我
最接近我想要的是:;然而,它关注的是MVC
//例如
[RoutePrefix(“api/测试”)]
公共类TestController:ApicController
{
[HttpGet]
[路线(“helloworld”)]
[ApiExplorerSettings(IgnoreApi=false)]
公共字符串HelloWorld(){
返回“你好,世界!”;
}
[HttpGet]
[路线(“再见世界”)]
[ApiExplorerSettings(IgnoreApi=true)]
公共字符串HelloWorld(){
返回“再见世界!”;
}
[HttpGet]
[路线(“hiworld”)]
[ApiExplorerSettings(IgnoreApi=true)]
公共字符串HelloWorld(){
返回“嗨,世界!”;
}
[HttpGet]
[路线(“seeyaworld”)]
[ApiExplorerSettings(IgnoreApi=true)]
公共字符串HelloWorld(){
返回“看你的世界!”;
}
}
我希望能够在我想使用的操作上使用ApiExplorerSettings,而不是标记我不想使用的操作。对于那些感兴趣的人,我最终重写了ApiExplorer类,以重写ShouldExploreAction和shouldexplorercontroller方法。我把布尔逻辑颠倒过来,它按要求工作 [根据要求用示例进行编辑] 您可以执行以下操作: 创建一个覆盖ApiExplorer的类
使用系统;
使用System.Linq;
使用System.Text.RegularExpressions;
使用System.Web.Http;
使用System.Web.Http.Controller;
使用System.Web.Http.Description;
使用System.Web.Http.Routing;
名称空间WebApi.Api
{
公共类CustomApiExplorer:ApiExplorer
{
公共CustomApiExplorer(HttpConfiguration配置):基本(配置)
{
}
///
///确定是否应考虑控制器。
///
///控制器路由参数值。
///关联的控制器描述符。
///关联的路由。
///如果应该探索控制器,则为True;否则为false。
公共覆盖布尔应扩展控制器(字符串controllerVariableValue、HttpControllerDescriptor controllerDescriptor、IHttpRoute路由)
{
if(string.IsNullOrEmpty(controllerVariableValue)| | controllerDescriptor==null | | route==null)
{
抛出新ArgumentException();
}
var setting=controllerDescriptor.GetCustomAttributes().FirstOrDefault();
//基本上,您可以检查是否使用了设置,以及ignore是否设置为true或false。您还可以检查路由是否如预期的那样,但这是一个不同的讨论。通过此操作,ApiExplorer通过只注册活动状态为IgnoreApi=false的API来更改其逻辑。
if(setting!=null&&!setting.IgnoreApi)
{
返回true;
}
返回false;
}
}
}
在WebApiConfig中使用自定义类
在WebApiConfig.cs文件中,您可以通过在Register(HttpConfiguration config)方法中放置以下行来覆盖IApiExplorer服务实例
公共静态无效寄存器(HttpConfiguration配置){
...
Replace(typeof(IApiExplorer),新的CustomApiExplorer(config));
...
}
您可以使用IDocumentFilter接口来实现它:
public class ApiDocFilter : IDocumentFilter
{
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
var pathsToRemove = swaggerDoc.Paths
.Where(pathItem => !pathItem.Key.Contains("/api/"))
.ToList();
foreach (var item in pathsToRemove)
{
swaggerDoc.Paths.Remove(item.Key);
}
}
}
在Startup.cs->ConfigureServices中使用过滤器:
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo {Title = "some API", Version = "v1"});
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
c.IncludeXmlComments(xmlPath);
c.DocumentFilter<ApiDocFilter>();//<-- use doc filter
});
services.AddSwaggerGen(c=>
{
c、 SwaggerDoc(“v1”,新的OpenApiInfo{Title=“someAPI”,Version=“v1”});
var xmlFile=$“{Assembly.getExecutionGassembly().GetName().Name}.xml”;
var xmlPath=Path.Combine(AppContext.BaseDirectory,xmlFile);
c、 includexmlcoments(xmlPath);
c、 DocumentFilter();//一个选项:创建一个常量。将属性值设置为该常量。@Amy这可以工作,但我们想使用或重用已经是.NET framework的一部分的东西。常量已经是该语言的一部分了……您可以包括一个例子吗?@ChrisGonzales复制起来应该不难,但我还是添加了一个例子。