4

我目前正在使用 Web API 2 的属性路由(http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api实现一个 Web API -2 )。我还使用帮助页面模块从 XML 注释自动生成文档(http://www.asp.net/web-api/overview/creating-web-apis/creating-api-help-pages)。

对于这个 API,我提供了对可选返回格式扩展的支持,因此每个 API 方法都定义了一对路由,如下所示:

[HttpGet]
[Route("Path/Foo")]
[Route("Path/Foo.{ext}")]
public HttpResponseMessage DoFoo()
{
    // Some API function.
}

这允许用户点击其中任何一个并获得结果:

www.example.com/api/Controller/Path/Foo 
www.example.com/api/Controller/Path/Foo.json
www.example.com/api/Controller/Path/Foo.xml

我的问题是,当帮助页面使用 MapHttpAttributeRoutes() 生成文档时,它会为每种方法选择两条路线。所以现在我看到了以下帮助:

api/Controller/Foo
api/Controller/Foo.{ext}

但我只想看到:

api/Controller/Foo.{ext}

我更愿意在每个方法上隐藏非扩展路由,以便每个方法只显示一个帮助页面条目。

有没有其他人尝试过类似的东西?有没有我想念的解决方法?

4

1 回答 1

9

我的问题是,您的 api 的消费者会很容易地发现它{ext}是可选的吗?...就个人而言,我更喜欢默认行为...但无论如何,以下是我能想到的一些解决方法:

  1. 一个快速而肮脏的解决方法。将 DoFoo 拆分为 2 个动作,例如 DoFoo() 和 DoFooWithExt 可能。请注意,我使用了一个名为 的属性ApiExplorerSettings,该属性用于 HelpPage。下面的例子:

    [HttpGet]
    [Route("Path/Foo")]
    [ApiExplorerSettings(IgnoreApi=true)]
    public HttpResponseMessage DoFoo()
    {
        return DoFooHelper();
    }
    
    [HttpGet]
    [Route("Path/Foo.{ext}")]
    public HttpResponseMessage DoFooWithExt()
    {
        return DoFooHelper();
    }
    
    private HttpResponseMessage DoFooHelper()
    {
        //do something
    }
    
  2. 创建一个自定义ApiExplorer(HelpPage 功能在内部使用)并检查特定路由,如下所示,并可以决定是否显示该特定路由的操作。

    // update the config with this custom implementation
    config.Services.Replace(typeof(IApiExplorer), new CustomApiExplorer(config));
    
    public class CustomApiExplorer : ApiExplorer
    {
        public CustomApiExplorer(HttpConfiguration config) : base(config)
        {
    
        }
    
        public override bool ShouldExploreAction(string actionVariableValue, HttpActionDescriptor actionDescriptor, IHttpRoute route)
        {
            if (route.RouteTemplate.EndsWith("Path/Foo", StringComparison.OrdinalIgnoreCase))
            {
                return false;
            }
    
            return base.ShouldExploreAction(actionVariableValue, actionDescriptor, route);
        }
    }
    
  3. ApiDescription从默认中获取所有列表,ApiExplorer然后过滤掉您不喜欢的描述。例子: Configuration.Services.GetApiExplorer().ApiDescriptions.Where((apiDesc) => !apiDesc.RelativePath.EndsWith("Path/Foo", StringComparison.OrdinalIgnoreCase))

于 2013-10-25T14:48:56.857 回答