C# 虚张声势的5罐';我找不到我的APIController

C# 虚张声势的5罐';我找不到我的APIController,c#,iis,asp.net-web-api,swashbuckle,C#,Iis,Asp.net Web Api,Swashbuckle,我的WebAPI 2项目确实需要API文档,我使用了Swashback 5 NuGet包。开箱即用,我可以点击{myrooturl}/swagger,弹出一个UI,但里面没有控制器、方法或任何东西。只是我的标题:[基本url:/EM.Services,api版本:v1] 我查看了Swashback文档,由于我使用的是由IIS托管的OWIN,因此我使用以下内容修改了SwaggerConfig: c.RootUrl(req => req.RequestUri.GetLeftPart(UriPa

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

我查看了Swashback文档,由于我使用的是由IIS托管的OWIN,因此我使用以下内容修改了SwaggerConfig:

c.RootUrl(req => req.RequestUri.GetLeftPart(UriPartial.Authority) + req.GetRequestContext().VirtualPathRoot.TrimEnd('/'));
根据本文件:

我还设置了项目的构建以生成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

我的网页有什么问题吗

    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"));
    }
而我的基本控制器(目前)做的并不多,只是有一个属性:

[BuildClaims]
public abstract class BaseController : ApiController
使用IIS Express或完整版IIS时,空页会在整个系统中持续存在

更新: 我制作的人工控制器的示例非常基本。它也没有出现,因为我仍然有锅炉板招摇过市的用户界面,其中没有任何内容

/// <summary>
/// I am a test
/// </summary>
[RoutePrefix("api/dummy")]
public class DummyController : ApiController
{
    [HttpGet]
    [Route("foo")]
    public int Foo()
    {
        return 42;
    }
}
//
///我是一个测试
/// 
[RoutePrefix(“api/虚拟”)]
公共类DummyController:ApiController
{
[HttpGet]
[路线(“foo”)]
公共int Foo()
{
返回42;
}
}

Swashback位于WebApi元数据层的顶部
ApiExplorer
。它从ApiExplorer获取操作描述,然后将它们映射到招摇过市的描述

由于您的控制器继承自BASECONTROLLER而非APICONTROLLER,因此它将无法工作

根据JimWolleys的评论

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

private IEnumerable

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

由于Swagger/Swashback正在连接到GlobalConfiguration,而且鉴于OWIN startup和Global.asax生活在不同的环境中(我认为),修复方法是连接您的WebAPI材料,从Global.asax注册,并让OWIN的应用程序对象使用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);

    }

如上所述重新布线后,我现在可以在swagger UI中看到控制器和操作。

我卡住了。。这些答案并没有完全帮助我。。。虽然他们带我去了那里。只是为了节省别人一些时间:

您必须从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配置文件中,将register方法更改为:

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

        config
            .EnableSwagger(c =>
                {...

希望这有帮助。

我发现这个链接非常有用。这个特定的解决方案是针对Microsoft.Azure.Mobile.Server API的,但它为我解决了这个问题


我发现我也有同样的问题。我创建了一个扩展方法来提供帮助

using Swashbuckle.Application;
using System.Web.Http;

public static class SwaggerExtensions
{
    public static HttpConfiguration EnableSwagger(this HttpConfiguration httpConfiguration)
    {
        httpConfiguration
            .EnableSwagger(c => c.SingleApiVersion("v1", "A title for your API"))
            .EnableSwaggerUi();
        return httpConfiguration;
    }
}
然后在我的Startup.cs中

public class Startup
{
    public void Configuration(IAppBuilder appBuilder)
    {
        HttpConfiguration httpConfiguration = new HttpConfiguration();

        httpConfiguration
            .EnableSwagger()    // <==== EXTENSION METHOD <==== //
            .MapHttpAttributeRoutes();

        httpConfiguration.Routes.MapHttpRoute(
            "DefaultApi",
            "api/{controller}/{id}",
            new {id = RouteParameter.Optional});

        appBuilder
            .UseWebApi(httpConfiguration);
    }
}
公共类启动
{
公共无效配置(IAppBuilder appBuilder)
{
HttpConfiguration HttpConfiguration=新的HttpConfiguration();
http配置

.EnableSwagger()//所有这些解决方案对我都有效,但它们都只是针对我的问题的恶意攻击。经过几个小时的调查,我发现问题在于我还使用了一瞥(或其他更改路由表的包)

以下是一个很好的总结:

  • Spile在HttpWebRoute之上添加了castle代理。因此HostedHttpRouteCollection是RouteProxy的集合,而不是 HttpWebRoute
  • APIExplorer类有flattRoutes方法,该方法在HostedHttpRouteCollection上执行foreach循环
  • GetEnumeratorHostedHttpRouteCollection的实现专门查找HttpWebRoute。请参阅下面的代码。自 已添加代理,枚举器始终返回0个路由

    public override IEnumerator GetEnumerator() { // Here we only care about Web API routes. return _routeCollection .OfType() .Select(httpWebRoute => httpWebRoute.HttpRoute) .GetEnumerator(); } 公共重写IEnumerator GetEnumerator() { //这里我们只关心Web API路由。 返回路径集合 第()类 .Select(httpWebRoute=>httpWebRoute.HttpRoute) .GetEnumerator(); }
  • 我很惊讶没有解决方案,您可以选择您想要使用的:虚张声势一瞥,但不能同时使用


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

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

    经过一番周折后,我发现我标记为
    [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()
        {
    
    我不是100%确定,但如果有关系的话,我也从

     public class MyAPIController : Controller
    
    致:

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


    希望这对将来的其他人有所帮助:)祝你好运!

    我在Owin+Swashback集成方面遇到了很多问题,但没有一个答案能为我解决所有问题。长话短说,我设法解决了所有问题,并创建了一个开源回购协议,作为任何需要它的人的模板


    请检查:

    我在使用OWIN时也遇到了此问题。通过按照中的建议仅安装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);
    

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

    默认情况下,您可以使用以下命令展开它:

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

    在我的情况下,我有一个类似的问题,亚历克斯C。我必须做两件事来修复
    // 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);
    
    .EnableSwaggerUi(c => {
        c.DocExpansion(DocExpansion.List);
    });
    
    using System.Web.Mvc;
    
    [RoutePrefix("v1/Awesome")]
    
    [RoutePrefix("v1/Amazing")]
    public class AmazingController : ApiController