ASP.Net Web Api – ApiExplorer不包含任何ApiDescriptions

我正在尝试在我的Web服务的控制器中实现一个Options方法,该方法将返回一个消息,其中包含与控制器关联的URI端点的有效HTTP方法。 我的Options方法看起来像这样:

public HttpResponseMessage Options() { var resp = new HttpResponseMessage(); resp.Content = new StringContent(""); var apiExplorer = GlobalConfiguration.Configuration.Services .GetApiExplorer(); foreach (ApiDescription api in apiExplorer.ApiDescriptions) { resp.Content.Headers.Add("Allow", api.HttpMethod.Method); } return resp; } 

我在具有Get,Post和Delete方法的控制器内部的全新Web Api项目(暗示:未改变的路由)中尝试了上述方法。 正如预期的那样,返回带有“Allow:GET,POST,DELETE”的响应。 但是,我遇到了麻烦,将其添加到我正在处理的更大的项目中。 在较大的项目中,ApiExplorer中的ApiDescriptions列表不包含任何元素。 为什么是这样? 我怀疑这是由于已经实现的自定义路由,尽管怀疑的唯一依据是以下链接:

http://forums.asp.net/t/1821651.aspx/1

有没有其他人经历过这个空的ApiDescription列表? 如果是这样,你找到了补救措施吗?

注意:我使用的是MCV 4 RC

如果您使用Glimpse,则可能必须禁用它的路径检查器:

              

Glimpse创建了在HostedHttpRouteCollection中打破枚举的RouteProxies: https : //github.com/mono/aspnetwebstack/blob/master/src/System.Web.Http.WebHost/Routing/HostedHttpRouteCollection.cs

我知道链接是单声道的,但标准的.Net也是如此。

您应该升级到昨天发布的WebApi RTM,然后查看昨天发布的新发布的ASP.NET WebApi帮助页面(预览版) 。

此程序包会自动为您站点上的Web API生成帮助页面内容。 您的帮助页面的访问者可以使用此内容来了解​​如何调用您的Web API。 帮助页面生成的所有内容都可以使用ASP.NET MVC和Razor完全自定义。

它正在实施ApiExplorer。

这个问题的解决方案是在ProjectName \ Areas \ HelpPage \ Controllers \ HelpController.cs中注释构造函数如下:

  public class HelpController : Controller { private const string ErrorViewName = "Error"; // public HelpController() // : this(GlobalConfiguration.Configuration) // { // } // public HelpController(HttpConfiguration config) // { // Configuration = config; // } ///  /// GlobalConfiguration By default ///  protected static HttpConfiguration Configuration { get { return GlobalConfiguration.Configuration; } } public ActionResult Index() { ViewBag.DocumentationProvider = Configuration.Services.GetDocumentationProvider(); return View(Configuration.Services.GetApiExplorer().ApiDescriptions); } .... 

不调用默认构造函数;

第二种方法是通过在默认构造函数中添加此属性[InjectionConstructor]来注入默认构造函数,如下所示:

 public class HelpController : Controller { private const string ErrorViewName = "Error"; [InjectionConstructor] public HelpController() : this(GlobalConfiguration.Configuration) { } public HelpController(HttpConfiguration config) { Configuration = config; } ///  /// GlobalConfiguration By default ///  protected static HttpConfiguration Configuration { get; private set; } ....