我有一个动作调用“ 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
答案 0 :(得分:0)
您不需要任何特殊路线。 DefaultApi
将route 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
}
}
要支持共享同一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)
有一个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;
}
以此,您可以检查要显示的内容。