使用Owin时无法使ASP.NET Web API 2帮助页面正常工作

时间:2013-09-20 16:08:28

标签: asp.net-web-api nancy owin asp.net-web-api-helppages

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

        }
    }

2 个答案:

答案 0 :(得分:32)

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包括帮助页面文件。

答案 1 :(得分:13)

经过大量挖掘/反复试验后找到解决方案。这个问题在这里有详细描述:http://aspnetwebstack.codeplex.com/discussions/453068

UseWebApi和UseHttpMessageHandler不会调用Next OWIN的中间件而不是404.这意味着如果您使用UseWebApi,那么Next就不会被调用,因此您无法使用它与任何其他中间件(例如Nancy或Web Api帮助页面)。

感谢@aliostad补丁: https://github.com/aliostad/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帮助页面,这完全解决了这个问题。 My blog post explains the background to this issue in detail