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