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

时间:2012-08-16 18:35:06

标签: c# asp.net asp.net-mvc asp.net-web-api asp.net-mvc-apiexplorer

我正在尝试在我的Web服务的控制器中实现一个Options方法,该方法将返回一个消息,其中包含与控制器关联的URI端点的有效HTTP方法。我的选项方法如下所示:

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;
}

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

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

还有其他人遇到过这个空的ApiDescription列表吗?如果是的话,你找到了补救措施吗?

注意:我正在使用MCV 4 RC

3 个答案:

答案 0 :(得分:3)

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

<glimpse defaultRuntimePolicy="On" endpointBaseUri="~/Glimpse.axd">
  <logging level="Off" />
  <tabs>
    <ignoredTypes>
      <add type="Glimpse.AspNet.Tab.Routes, Glimpse.AspNet" />
    </ignoredTypes>
  </tabs>
  <inspectors>
    <ignoredTypes>
      <add type="Glimpse.AspNet.Inspector.RoutesInspector, Glimpse.AspNet" />
    </ignoredTypes>
  </inspectors>
</glimpse>

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

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

答案 1 :(得分:1)

您应该升级到昨天发布的WebApi的RTM,然后查看昨天发布的新发布的ASP.NET WebApi Help Page (Preview)

  

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

它正在实施ApiExplorer。

答案 2 :(得分:0)

此问题的解决方案是在 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;
    //        }

            /// <summary>
            /// GlobalConfiguration By default
            /// </summary>
            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;
        }

        /// <summary>
        /// GlobalConfiguration By default
        /// </summary>
        protected static HttpConfiguration Configuration { get; private set; }
....