在WebApi帮助页面上过滤操作

时间:2019-06-13 14:35:12

标签: c# asp.net-web-api2 visual-studio-2019

我有一个动作调用“ Authenticate”,并在WebApiConfig中添加了一个地图来调用此动作。

config.Routes.MapHttpRoute(
        name: "LoginApi",
        routeTemplate: "api/login",
        defaults: new { controller = "Login", action = "Authenticate" }
);

现在,在帮助页面中,我可以执行同一操作的两个操作,而我只想要一个。

POST api/Login/Authenticate

POST api/Login

如何过滤/隐藏帮助页面中的操作并仅显示其中一个? 喜欢:

POST api/Login

我不能使用[ApiExplorerSettings(IgnoreApi = true)],因为它会隐藏两个动作。

这是我正在使用的软件包: Microsoft.AspNet.WebApi.HelpPage 5.2.7

2 个答案:

答案 0 :(得分:0)

您不需要任何特殊路线。 DefaultApiroute your action by convention。删除您自定义的LoginApi路由并在控制器中使用约定方法

public class LoginController : ApiController
{
    public void Post()
    {
        // authenticate here
    }
}

或者如果您坚持要命名动作Authenticate,则可以使用HTTP动词使用路由变体形式

public class LoginController : ApiController
{
    [HttpPost]
    public void Authenticate()
    {
        // authenticate here
    }
}

这将使API资源管理器生成所需的帮助页面: ASP.NET Web Api Help Page

编辑

要支持共享同一HTTP动词的多种操作方法,您应该像以前一样通过操作名称配置路由,但是在路由中看不到{action}参数。应该是:

config.Routes.MapHttpRoute(
    name: "LoginApi",
    routeTemplate: "api/Login/{action}",
    defaults: new { controller = "Login", action = "Authenticate" }
);

通过指定上述默认操作,URL /api/Login将被正确路由到LoginController.Authenticate,但是该操作将在帮助页面上显示为POST api/Login/Authenticate,因为{{1}某种程度上无法识别默认操作。要解决这个问题,我宁愿像您在自己的答案中那样,远离黑客帮助页面,因为它可能会咬人。您可以改为使用RouteAttribute强制执行默认操作的路线。控制器代码然后会像这样:

ApiExplorer

然后,帮助页面将显示:

  

POST api /登录

     

POST api /登录/注册

答案 1 :(得分:0)

在文件ApiGroup.cshtml中: enter image description here

有一个foreach,您可以隐藏所需的操作,如下所示:

@foreach (var api in Model)
{
    string[] paths = new string[] { "api/Login/authenticate" };
    if(paths.Contains(api.RelativePath))
    { continue; }

    <tr>
        <td class="api-name">
           <a href="@Url.Action("Api", "Help", 
              new { apiId = api.GetFriendlyId() })">
              @api.HttpMethod.Method @api.RelativePath
           </a></td>
        <td class="api-documentation">
        @if (api.Documentation != null)
        {
            <p>@api.Documentation</p>
        }
        else
        {
            <p>No documentation available.</p>
        }
        </td>
    </tr>
}

在此块中,我添加了以下代码:

string[] paths = new string[] { "api/Login/authenticate" };
if(paths.Contains(api.RelativePath))
{ 
   continue; 
}

以此,您可以检查要显示的内容。