我已经在我的WebAPI应用程序中实现了一个版本控制框架,并且非常希望将其与Microsoft的新“帮助页面”扩展一起使用。

Microsoft.AspNet.WebApi.HelpPage

SDammann.WebApi.Versioning

很简单,我不知道如何让他们一起工作。我有2个项目:

  • AdventureWorks.Api(主要主机/根应用程序)
  • AdventureWorks.Api.v1(包含API第一版的类库)

  • 版本控制按预期工作。

    我尝试在根应用程序上安装HelpPage程序包,当我浏览到帮助页面时,似乎找不到任何 Controller 。在内部,我相信它使用:
    Configuration.Services.GetApiExplorer().ApiDescriptions
    

    这没有返回结果,所以我得到一个错误。

    谁能协助我使这两个软件包协同工作?

    编辑:
    一开始,我不确定这是一个路由问题,但是最近的评论似乎暗示了其他问题。这是我的RouteConfig.cs
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            routes.MapHttpRoute(
                name: "SldExportAliasApi",
                routeTemplate: "api/v{version}/sld-export/{id}",
                defaults: new { id = RouteParameter.Optional, controller = "Export" }
            );
    
            routes.MapHttpRoute(
                name: "LinkRoute",
                routeTemplate: "api/v{version}/link/{system}/{deployment}/{view}",
                defaults: new { controller = "Link" }
            );
    
            routes.MapHttpRoute(
                 name: "DefaultSubParameterApi",
                 routeTemplate: "api/v{version}/{controller}/{id}/{param}",
                 defaults: new { id = RouteParameter.Optional, param = RouteParameter.Optional }
            );
    
            routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/v{version}/{controller}/{action}/{id}",
                defaults: new { action = "Index", id = RouteParameter.Optional }
            );
    
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
    

    最佳答案

    您需要从项目AdventureWorks.Api.v1项目中获取文档XML文件,并将其放置在AdventureWorks.Api项目的bin文件夹中:

    然后将这些行添加到您的Application_Start方法中:

    // enable API versioning
            GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector), new RouteVersionControllerSelector(GlobalConfiguration.Configuration));
            GlobalConfiguration.Configuration.Services.Replace(typeof(IApiExplorer), new VersionedApiExplorer(GlobalConfiguration.Configuration));
            GlobalConfiguration.Configuration.Services.Replace(typeof(IDocumentationProvider),
                                    new XmlCommentDocumentationProvider(System.IO.Path.GetDirectoryName(
                                        System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) +
                                                                        "\\Adventure.Api.v1.XML"));
    

    然后,您可以使用文档查看您的API。

    有时版本号不能正确提取,而是用???代替。

    要解决此问题,请添加:
    if (api.ActionDescriptor.ControllerDescriptor.ControllerType.Namespace != null)
        {
            var versionName = api.ActionDescriptor.ControllerDescriptor.ControllerType.Namespace.Replace(".Controllers", "").Split('.').Last();
            api.RelativePath = api.RelativePath.Replace("v???", versionName);
        }
    

    恰好在此位置到您的ApiGroup.cshtml:
    @foreach (var api in Model)
    {
        if (api.ActionDescriptor.ControllerDescriptor.ControllerType.Namespace != null)
        {
            var versionName = api.ActionDescriptor.ControllerDescriptor.ControllerType.Namespace.Replace(".Controllers", "").Split('.').Last();
            api.RelativePath = api.RelativePath.Replace("v???", versionName);
        }
        <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>
    }
    

    这应该可以解决问题!

    10-02 01:42