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