Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ApiExplorer:如何更改IgnoreApi的默认值_C#_Asp.net Web Api_Asp.net Apicontroller - Fatal编程技术网

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复制起来应该不难,但我还是添加了一个例子。