ASP.Net Web API - ApiExplorer 不包含任何 ApiDescription



我正在尝试在我的 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;
}

我已经在具有 Get、Post 和 Delete 方法的控制器内部的全新 Web API 项目(暗示:未更改的路由)中尝试了上述方法。 正如预期的那样,返回带有"允许:获取、发布、删除"的响应。 但是,我遇到了麻烦,将其添加到我正在从事的一个更大的项目中。 在较大的项目中,ApiExplorer 中的 ApiDescriptions 列表不包含任何元素。 这是为什么呢? 我怀疑这是由于已实施的自定义路由,尽管这种怀疑的唯一依据是以下链接:

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

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

注意:我正在使用 MCV 4 RC

如果您

使用 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 创建 RouteProxies 来破坏 HostedHttpRouteCollection 中的枚举: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。帮助页面生成的所有内容都可以使用 MVC 和 Razor ASP.NET 完全自定义。

它正在幕后实现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;
    //        }
            /// <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; }
....

相关内容

  • 没有找到相关文章

最新更新