使用Owin时无法获取ASP.NET Web API 2帮助页面怎么办?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (48)

我已经为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);

        }
    }
提问于
用户回答回答于

经过大量的挖掘/试验和错误后找到解决方案。这个问题在这里很好地描述:http : //aspnetwebstack.codeplex.com/discussions/453068

UseWebApi和UseHttpMessageHandler不会调用除404之外的下一个OWIN的中间件。这意味着如果您使用UseWebApi,那么Next永远不会被调用,因此您不能将其用于任何其他中间件(例如Nancy或Web Api帮助页面)。

补丁:https//github.com/aliostad/CacheCow/blob/master/samples/UsingCacheCowWithNancyAndOwin/HttpMessageHandlerAdapterModified.cs#L43

可以按预期工作。我希望团队合并这个拉动请求,因为UseWebApi打破了Owin设计目标IMO。

我写了一个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);    
}

还可以使用WebApi而不是MVC托管帮助页面,这对于自我托管非常有用http://blogs.msdn.com/b/yaohuang1/archive/2012/12/20/making-asp-net-web-api -help页的工作,对自托管,services.aspx

对于Web Api,它也可以工作,通过更改HelpPageAreaRegistration.RegisterArea和HelpController的构造函数,我的解决方法也适用,因此请选择适合情况的最适合的解决方案。

但是,我仍然遇到与其他中间件一起使用UseWebApi的问题,并且它不会调用Next()(似乎只发生在使用IIS而不是自身主机时)。我发现我的映射路径和迫使next被调用的解决方法是所有Owin中间件Nancy,Simple.Web等的有效解决方法。

我开发了Owin中间件来生成ASP.NET Web API帮助页面,我们知道并喜欢它完全解决了这个问题。我的博客文章详细解释了这个问题的背景

用户回答回答于

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。

扫码关注云+社区