经过大量挖掘/反复试验后找到了解决方案。这个问题在这里得到了很好的描述:http: //aspnetwebstack.codeplex.com/discussions/453068
UseWebApi 和 UseHttpMessageHandler 除了 404 之外,不调用 Next OWIN 的中间件。这意味着如果您使用 UseWebApi 就是这样,Next 永远不会被调用,因此您不能将它与任何其他中间件一起使用(例如 Nancy 或 Web Api 帮助页面)。
感谢@alostad 补丁:
https ://github.com/alostad/CacheCow/blob/master/samples/UsingCacheCowWithNancyAndOwin/HttpMessageHandlerAdapterModified.cs#L43
你可以让它按预期工作。我希望团队合并为此的拉取请求,因为 UseWebApi 打破了 Owin 设计目标 IMO。
2014 年 2 月 13 日更新
我写了一个 Owin 扩展来解决这个问题:
internal static void UseWebApiAndHelp(this IAppBuilder app, HttpConfiguration config)
{
WepApiStartup.Configure(config);
app.UseHandlerAsync((request, response, next) =>
{
if (request.Path == "/") //app.Map using a regex exclude list would be better here so it doesn't fire for every request
{
response.StatusCode = 301;
response.SetHeader("Location", "/Help");
return Task.FromResult(0);
}
return next();
});
// Map the help path and force next to be invoked
app.Map("/help", appbuilder => appbuilder.UseHandlerAsync((request, response, next) => next()));
app.UseWebApi(config);
}
2015 年 7 月 1 日更新
您还可以使用 WebApi 而不是 MVC 托管帮助页面,这非常适合自托管http://blogs.msdn.com/b/yaohuang1/archive/2012/12/20/making-asp-net-web-api -help-page-work-on-self-hosted-services.aspx
2015 年 9 月 10 日更新
对于Web Api,我尝试了@hongye-sun 的回答,它也可以工作,按照@gspatel 所说的更改HelpPageAreaRegistration.RegisterArea 和HelpController 的构造函数。我的解决方法也很有效,因此请选择最适合您情况的方法。
但是,在将 UseWebApi 与其他中间件一起使用并且它不调用 Next() 时我仍然遇到问题(似乎只在使用 IIS 而不是自托管时发生)。我发现映射路径并强制下一个被调用的解决方法是所有 Owin 中间件 Nancy、Simple.Web 等的有效解决方法。
2016 年 1 月 13 日更新
我开发了 Owin 中间件来生成我们熟悉和喜爱的 ASP.NET Web API 帮助页面,它完全解决了这个问题。我的博文详细解释了这个问题的背景