Swashbuckle 5找不到我的ApiControllers

时间:2015-08-05 18:30:21

标签: c# iis asp.net-web-api swashbuckle

我真的需要我的WebAPI 2项目的API文档,我使用了Swashbuckle 5 NuGet包。开箱即用,我可以点击{myrooturl} / swagger并弹出一个UI,但那里没有控制器,方法或任何东西。只是我的标题:[base url:/EM.Services,api version:v1]

我看了一下Swashbuckle文档,因为我正在使用由IIS托管的OWIN,所以我修改了SwaggerConfig:

c.RootUrl(req => req.RequestUri.GetLeftPart(UriPartial.Authority) + req.GetRequestContext().VirtualPathRoot.TrimEnd('/'));

根据此文档:https://github.com/domaindrivendev/Swashbuckle/blob/1326e753ce9b3a823b3c156b0b601134692ffc58/README.md#transitioning-to-swashbuckle-50

我还设置了项目的构建以生成XML文档,并将我的SwaggerConfig指向它:

    private static string GetXmlCommentsPath()
    {
        // tried with an without the \bin
        return String.Format(@"{0}\bin\EM.Services.XML", AppDomain.CurrentDomain.BaseDirectory);
    }

我不确定XML文档的工作/不工作是否与它有关,因为我在swagger-ui页面上绝对没有控制器。

对于它的价值,我的所有控制器都继承自BaseController,而BaseController又继承自ApiController。

我的WebApiConfig有什么问题吗?

    public static void Register(HttpConfiguration config)
    {

        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        config.Filters.Add(new ValidateModelAttribute());

        config.Filters.Add(new BaseAuthenticationAttribute());

        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
        jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        jsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    }

我的具体控制器都看起来像这样(我已经尝试为ApiController提供BaseController并且没有变化):

[RoutePrefix("api/whatever")]
public class FooController : BaseController

并且我的Base控制器没有做太多(还),只有一个属性:

[BuildClaims]
public abstract class BaseController : ApiController

空页继续使用IIS Express或完整的IIS。

更新: 我做的一个人为的控制器的例子非常基本。它也没有显示出来,因为我仍然没有任何东西的锅炉板招摇ui。

/// <summary>
/// I am a test
/// </summary>
[RoutePrefix("api/dummy")]
public class DummyController : ApiController
{
    [HttpGet]
    [Route("foo")]
    public int Foo()
    {
        return 42;
    }
}

11 个答案:

答案 0 :(得分:21)

我发现了问题。在创建一个空的测试项目之后,我注意到WebApiConfiguration是从global.asax app start注册的,而不是OWIN启动类(就像我一样)。

由于Swagger / Swashbuckle正在挂钩GlobalConfiguration,并且OWIN启动和Global.asax生活在不同的环境中(我认为),修复是将你的WebAPI东西连接到Global.asax注册并拥有OWIN的app对象使用WebAPI。

相关位:

   // global asax
    protected void Application_Start(object sender, EventArgs e)
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
       // ... more stuff
    }

   //startup.cs
   public void Configuration(IAppBuilder app)
    {
        // This must happen FIRST otherwise CORS will not work.
        app.UseCors(CorsOptions.AllowAll);

        HttpConfiguration config = new HttpConfiguration();

        ConfigureAuth(app);

        // webapi is registered in the global.asax
        app.UseWebApi(config);

    }

如上所述重新布线后,我现在可以看到控制器&amp; swagger UI中的动作。

答案 1 :(得分:18)

我被困了......这些答案并没有给我充分的帮助......虽然他们把我带到了那里。只是为了节省其他人的时间:

您必须从OWIN传递http配置,然后在其上注册而不是像这样使用GlobalConfiguration类:

//starup.cs
public void Configuration(IAppBuilder app)
    {
        Config = new HttpConfiguration();
        WebApiConfig.Register(Config);

        app
            .UseResponseLogging()
            .UseRequestLogging()
            .UseHttpErrors()
            .UseExceptionLogging()
            .UseWebApi(Config);

        HandlerConfig.Register(Config);

        SwaggerConfig.Register(Config);
    }

并在swagger配置文件中,将寄存器方法更改为:

public static void Register(HttpConfiguration config)
    {
        var thisAssembly = typeof(SwaggerConfig).Assembly;

        config
            .EnableSwagger(c =>
                {...

希望这有帮助。

答案 2 :(得分:3)

我发现我遇到了同样的问题。我创建了一个扩展方法来帮助

import

然后在我的Startup.cs

react-native

答案 3 :(得分:3)

所有这些解决方案对我来说都很有用,但对我来说,所有这些解决方案都是讨厌的黑客。经过几个小时的调查后我发现,问题是我还使用 Glimpse (或其他更改路由表的软件包)。

以下是一个很棒的摘要:https://github.com/domaindrivendev/Swashbuckle/issues/468#issuecomment-139246748

  
      
  1. Glimpse在HttpWebRoute之上添加了城堡代理。所以HostedHttpRouteCollection是 RouteProxy的集合而不是   HttpWebRoute 即可。
  2.   
  3. APIExplorer类有 FlattenRoutes 方法,它在HostedHttpRouteCollection上执行foreach循环。
  4.   
  5. GetEnumerator 实施 HostedHttpRouteCollection 专门查找HttpWebRoute。请参阅下面的代码。一瞥   添加了代理,枚举器总是返回0路由!!

    public override IEnumerator GetEnumerator()
    {
         // Here we only care about Web API routes.
         return _routeCollection
             .OfType()
             .Select(httpWebRoute => httpWebRoute.HttpRoute)
             .GetEnumerator();
    }
  6.   

我担心没有解决方案,您可以选择要使用的内容: Swashbuckle Glimpse ,但不能同时使用

当然,您可以尝试运行其中一种解决方法,但存在意外行为和棘手错误的风险。

答案 4 :(得分:2)

我自己也有同样的问题,但这些都没有帮助我。

经过一番捣乱后,我发现我标记为import { db, st } from 'path/to/file' 的路线没有被招摇发现。

[System.Web.Mvc.Route("visit")]

但是 [HttpGet] // ROUTE ATTRIBUTE NOT FOUND BY SWAGGER [System.Web.Mvc.Route("visit")] public string Visit() {

[System.Web.Http.Route("visit")]

我不是百分百肯定,但如果重要的话,我也会从

切换
    [HttpGet]
    // ROUTE ATTRIBUTE *IS* FOUND BY SWAGGER
    [System.Web.Http.Route("visit")]
    public string Visit()
    {

为:

 public class MyAPIController : Controller

更准确地说,我删除了System.Web.Mvc的“using”语句,但代码列出是为了说明目的。

希望将来帮助别人:)祝你好运!

答案 5 :(得分:1)

Swashbuckle位于WebApi的元数据层ApiExplorer之上。它从ApiExplorer获取操作描述,然后将它们映射到Swagger描述。

由于您的控制器继承自BASECONTROLLER而不是APICONTROLLER,因此无法使用

根据JimWolleys的评论

 private IEnumerable<ApiDescription> GetApiDescriptionsFor(string apiVersion)
    {
        return (_options.VersionSupportResolver == null)
            ? _apiExplorer.ApiDescriptions
            : _apiExplorer.ApiDescriptions.Where(apiDesc => _options.VersionSupportResolver(apiDesc, apiVersion));
    }

这是为Swashbuckle提供所有api调用的方法。它需要一个IApiExplorer。如果它没有被修改为采取不同的东西,它需要提供默认的ApiExplorer。其中只有关于从ApiController继承的东西的信息

Swashbuckle git repo. just search for GetApiDescriptionsFor and it will take you straight to the method

答案 6 :(得分:0)

我发现此链接非常有用。此特定解决方案特定于Microsoft.Azure.Mobile.Server API,但它解决了我的问题。

Azure Mobile Apps Server and Swagger

答案 7 :(得分:0)

我在Owin + Swashbuckle集成方面遇到了很多问题,这些答案都无法解决我的所有问题。长话短说,我设法解决了所有问题,并创建了一个开放源代码仓库以用作需要它的任何人的模板。

请检查:ASPSwaggerOwinTemplate

答案 8 :(得分:0)

我也使用OWIN遇到了这个问题。通过按照here的建议仅安装Swashbuckler Core并通过如下编辑Startup.cs来解决该问题:

// Startup.cs
            // ...
            HttpConfiguration config = new HttpConfiguration();
            // ...
            config
                .EnableSwagger(c =>
                {
                    ////add if there's custom root path
                    //c.RootUrl(req =>
                    //    req.RequestUri.GetLeftPart(UriPartial.Authority) +
                    //    req.GetRequestContext().VirtualPathRoot.TrimEnd('/'));

                    c.SingleApiVersion("v1", "A title for your API");
                })
                .EnableSwaggerUi();
            // ...
            appBuilder.UseWebApi(config);

答案 9 :(得分:0)

我熟悉自动扩展控制器的 .NET 核心版本的 Swashbuckle。当我在开发一个框架(非核心)API 时,当我终于设法显示一些东西时,我很困惑,因为我不知道点击显示/隐藏,但仍然认为它不起作用。

enter image description here

默认情况下,您可以使用以下内容展开它:

.EnableSwaggerUi(c => {
    c.DocExpansion(DocExpansion.List);
});

答案 10 :(得分:0)

就我而言,我遇到了与 Alex C 类似的问题。我必须做两件事来解决它:

第一件事是我有一个关于使用 MVC 的导入语句,如下所示:

using System.Web.Mvc;

我删除了那个导入语句,解决了一半的问题。我注意到的另一件事是,在一个 出现在 Swashbucke 中的控制器中有一个这样的注释

[RoutePrefix("v1/Awesome")]

其中 Awesome 是控制器 AwesomeController 的名称。所以我把那个路由前缀注释放在我的类声明之前,现在它显示在 Swagger 界面中

[RoutePrefix("v1/Amazing")]
public class AmazingController : ApiController

因此,如果其他人遇到此问题,您可以检查是否需要像我一样添加路由前缀。