使用 Owin 时无法使 ASP.NET Web API 2 帮助页面正常工作
Posted
技术标签:
【中文标题】使用 Owin 时无法使 ASP.NET Web API 2 帮助页面正常工作【英文标题】:Can't get ASP.NET Web API 2 Help pages working when using Owin 【发布时间】:2013-09-26 02:30:04 【问题描述】:我已经为 Web Api 2 安装了正确的包
Install-Package Microsoft.AspNet.WebApi.HelpPage -Pre
但是帮助区域没有被映射并且返回 404(Web Api 工作正常)。我使用 Microsoft.Owin.Host.SystemWeb 作为主机。下面是我的启动代码。
public class Startup
public void Configuration(IAppBuilder app)
//Required for MVC areas new HttpConfiguration() doesn't work with MVC
var config = GlobalConfiguration.Configuration;
AreaRegistration.RegisterAllAreas();
WepApiStartup.Configure(config);
app.UseWebApi(config);
【问题讨论】:
【参考方案1】:GlobalConfiguration.Configuration 是特定于 Web 主机的 HttpConfiguraiton,只能用于 Web 主机方案。与 OWIN 主机一起使用会导致意外问题。
请改用以下代码:
public class Startup
public static HttpConfiguration HttpConfiguration get; private set;
public void Configuration(IAppBuilder app)
HttpConfiguration = new HttpConfiguration();
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(HttpConfiguration);
app.UseWebApi(HttpConfiguration);
将项目中的所有 GlobalConfiguration.Configuration 替换为 Startup.HttpConfiguration 包含帮助页面文件。
【讨论】:
这当然适用于这样的事情:cfg.Services.Replace(typeof(IHttpControllerActivator), new CompositionRoot());非常感谢! Help中只有两个地方需要替换:HelpPageAreaRegistration.RegisterArea和HelpController的构造函数。像魅力一样工作。 正如@gspatel 所说,如果你将它传递给 HelpPageAreaRegistration.RegisterArea 并在 Startup 类的静态属性中公开你的 HttpConfiguration ,那么你也可以将它传递给 HelpController 的构造函数。 @Hongye Sun 认为您刚刚为我的学位保存了我的论文项目,遇到了这个问题,没有其他人有解决方案。干杯!【参考方案2】:经过大量挖掘/反复试验,找到了解决方案。这个问题在这里得到了很好的描述:http://aspnetwebstack.codeplex.com/discussions/453068
UseWebApi 和 UseHttpMessageHandler 除了 404 之外,不会调用 Next OWIN 的中间件。这意味着如果您使用 UseWebApi 就是这样,Next 永远不会被调用,因此您不能将它与任何其他中间件一起使用(Nancy 或 Web Api 帮助页面示例)。
感谢@aliostad 补丁: https://github.com/aliostad/CacheCow/blob/master/samples/UsingCacheCowWithNancyAndOwin/HttpMessageHandlerAdapterModified.cs#L43
您可以让它按预期工作。我希望团队合并为此的拉取请求,因为 UseWebApi 打破了 IMO 的 Owin 设计目标。
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 帮助页面,从而彻底解决了这个问题。 My blog post explains the background to this issue in detail
【讨论】:
看来这个问题还没有解决。有什么好的解决方法吗? 我找不到app.UseHandlerAsync
,所以我改用app.Use((context, next) => ...
。
抱歉,您需要:Install-Package Owin.Extensions以上是关于使用 Owin 时无法使 ASP.NET Web API 2 帮助页面正常工作的主要内容,如果未能解决你的问题,请参考以下文章
Asp.Net Web API 2第十课——使用OWIN自承载Web API
尝试在 ASP.net Web API 中发生授权之前使用 OWIN 注入授权标头
没有 OWIN 和 AspNet.Identity 的基于 Asp.Net Web Api 令牌的授权
JSON Web Token in ASP.NET Web API 2 using Owin