ASP.Net的Web API - ApiExplorer不含任何ApiDescriptions

2019-06-27 02:23发布

我想实现我的web服务的控制器的选项方法将返回包含与控制器相关的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

Answer 1:

如果您使用的一瞥,你可能需要禁用它的路线检查:

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

管窥创建于HostedHttpRouteCollection打破枚举RouteProxies: https://github.com/mono/aspnetwebstack/blob/master/src/System.Web.Http.WebHost/Routing/HostedHttpRouteCollection.cs

我知道这个链接是单声道,但同样适用于标准的.NET。



Answer 2:

你应该看看升级到这是昨天发布的,然后检查了新发布的WebAPI的RTM ASP.NET的WebAPI帮助页面(预览版)这是昨日也发布了。

本软件包自动生成您的网站的Web API的帮助页面的内容。 游客到您的帮助页面可以使用这个内容来学习如何调用您的Web的API。 通过帮助页面产生的一切使用ASP.NET MVC和刀片是完全可定制。

它执行的是在幕后的ApiExplorer。



Answer 3:

这个问题的解决办法是在项目名\区\ HelpPage \控制器评论\ 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; }
....


文章来源: ASP.Net Web Api - ApiExplorer does not contain any ApiDescriptions