14

我正在尝试在我的 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 项目(含义:未更改的路由)中尝试了上述方法。正如预期的那样,返回“允许:GET、POST、DELETE”的响应。但是,我遇到了麻烦,将其添加到我正在处理的更大项目中。在较大的项目中,ApiExplorer 中的 ApiDescriptions 列表不包含任何元素。为什么是这样?我怀疑这是由于已实施的自定义路由,尽管这种怀疑的唯一依据是以下链接:

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

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

注意:我使用的是 MCV 4 RC

4

3 回答 3

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 也是如此。

于 2016-03-04T09:31:24.700 回答
1

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

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

它正在幕后实现 ApiExplorer。

于 2012-08-16T19:46:10.103 回答
1

这个问题的解决方案是在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; }
....
于 2014-05-23T13:25:04.693 回答