【问题标题】:swagger UI is not showing anything in webapiswagger UI 在 webapi 中没有显示任何内容
【发布时间】:2016-08-30 04:29:16
【问题描述】:

为了使用 Swashbuckle 创建 Swagger 文档,我一直关注 this 到 xml 文档部分。它应该允许我通过(在我的情况下)查看端点:

http://localhost:51854/swagger/ui/index

很遗憾,我看不到任何端点:

任何想法为什么以及如何解决这个问题?请注意,我从一个空的 webapi 项目创建了我的 webapi——也许这就是问题所在。一定是缺少了什么,但我不确定是什么......

我现在已将以下代码确定为根本原因。在 Global.asax.cs 中:

var container = new XyzWebApiStructureMapContainerConfigurator().Configure(GlobalConfiguration.Configuration);
GlobalConfiguration.Configuration.Services
.Replace(typeof(IHttpControllerActivator),
new StructureMapHttpControllerActivator(container));

一些类:

public class XyzWebApiStructureMapContainerConfigurator
{
    public IContainer Configure(HttpConfiguration config)
    {
        var container = new Container(new BlaWebApiRegistry());
        config.DependencyResolver = new StructureMapDependencyResolver(container);
        return container;
    }
}

public class StructureMapDependencyResolver : StructureMapDependencyScope, IDependencyResolver, IHttpControllerActivator
{
    private readonly IContainer _container;

    public StructureMapDependencyResolver(IContainer container)
        : base(container)
    {
        _container = container;
        container.Inject<IHttpControllerActivator>(this);
    }

    public IDependencyScope BeginScope()
    {
        return new StructureMapDependencyScope(_container.GetNestedContainer());
    }

    public IHttpController Create(
        HttpRequestMessage request,
        HttpControllerDescriptor controllerDescriptor,
        Type controllerType)
    {
        var scope = request.GetDependencyScope();
        return scope.GetService(controllerType) as IHttpController;
    }
}

PS:

简化的控制器代码:

[RoutePrefix("api/XYZ")]
public class BlaController : ApiController
{
    private readonly ISomething _something;

    public BlaController(ISomething something)
    {
        _something = something;
    }

    [Route("")]
    [HttpGet]
    public IHttpActionResult Resources([FromUri] BlaRequest blaRequest)
    {
        // something exciting
        return Ok(returnObject);
    }
}

PPS:

更多代码:

// WebApiConfig

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services  

    // Web API routes
    config.MapHttpAttributeRoutes();

    //var cors = new EnableCorsAttribute("*", "*", "*");
    config.EnableCors();

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

// Global.asax.cs

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);

        GlobalConfiguration.Configuration.Formatters.Clear();
        GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());

        var container = new XyzWebApiStructureMapContainerConfigurator().Configure(GlobalConfiguration.Configuration);
        GlobalConfiguration.Configuration.Services
        .Replace(typeof(IHttpControllerActivator),
            new StructureMapHttpControllerActivator(container));
    }
}

购买力平价:

{
swagger: "2.0",
info: {
version: "v1",
title: "Bla.Di.Bla"
},
host: "localhost:51854",
schemes: [
"http"
],
paths: { },
definitions: { }
}

【问题讨论】:

  • 您的控制器类的名称是什么?有时这只是由于没有以“Controller”为后缀的类引起的。例如ProductController.cs 等。您的端点的其他详细信息,例如是否使用属性路由或基于约定的路由设置路由也会有所帮助。
  • @strickt01 - 谢谢。我添加了一些控制器示例代码。
  • 您在使用 OWIN 吗?如果是这样this might help.
  • 你在localhost:51854/swagger/docs/v1获取的swagger.json内容是什么?
  • @strickt01 Owin 被引用但不确定是否被使用。我们的基础架构专家必须进行一些调整才能在 IIS 中为远程 ajax 请求工作。我添加了更多代码。请查看 PPS。

标签: asp.net-web-api2 swagger structuremap swagger-ui swashbuckle


【解决方案1】:

原来是这一行:

config.DependencyResolver = new StructureMapDependencyResolver(container);

在问题的类 XyzWebApiStructureMapContainerConfigurator 中引起了一些问题。

希望这对将来的某人有所帮助。

【讨论】:

  • 我遇到了同样的问题,并且在上面的线路大摇大摆之后工作正常。但是,DI坏了。上面的任何替代方案没有评论?
  • 这似乎不是一个解决方案。是SwaggerConfig和DI注册类在同一个命名空间的问题吗?
【解决方案2】:

有同样的问题。原来 DI(在我的例子中是 Unity)被配置为绑定所有加载的程序集(其中之一是 Swashbuckle.Core)。

只需对绑定哪些程序集进行一些改进即可解决该问题:

var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(asm => asm.FullName.StartsWith("MySolution.MyProject"));

// Web API configuration and services
var container = new UnityContainer();
container.RegisterTypes(
    AllClasses.FromAssemblies(assemblies),
    WithMappings.FromMatchingInterface,
    WithName.Default);

config.DependencyResolver = new UnityDependencyResolver(container);

【讨论】:

    【解决方案3】:

    我在招摇时遇到了同样的问题,我花了很长时间来寻找解决方案。终于拿到了一份。 为每个控制器的动作方法添加 [HttpGet] 或 [HttpPost] 属性。

    [HttpPost]
    public IActionResult TestMethod()
     {
      //// Some code
     }
    

    【讨论】:

      【解决方案4】:

      我意识到这是一个老问题,但我刚刚遇到它并且对已经建议的解决方案有不同的解决方案。我希望它对其他遇到问题的人有用。

      问题是由结构图扫描引起的。我的 Structuremap.Registry 类中有以下代码行

      Scan(scan =>
      {
          ....
          scan.AssembliesFromApplicationBaseDirectory();
          scan.TheCallingAssembly();
          scan.WithDefaultConventions();
      });
      

      线

      scan.AssembliesFromApplicationBaseDirectory();

      正在阻止 Swagger 工作。我已经改成

      scan.AssembliesFromApplicationBaseDirectory(MyDllsPathFilter());
      

      现在 Swagger 正在按预期工作。

      【讨论】:

        猜你喜欢
        • 2015-07-31
        • 2022-07-21
        • 2016-04-01
        • 2014-09-29
        • 1970-01-01
        • 2020-03-24
        • 2014-07-21
        • 2016-02-19
        • 2020-06-16
        相关资源
        最近更新 更多