swagger UI ничего не показывает в webapi

Я проследил это до части документа xml, чтобы создать документацию Swagger с использованием Swashbuckle. Это должно позволить мне просматривать конечные точки через (в моем случае):

HTTP: // локальный: 51854 / чванство / щ / индекс

К сожалению, я не вижу никаких конечных точек:

Есть идеи, почему и как это исправить? Обратите внимание, что я создал свой 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));
    }
}

PPPS:

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

6 ответов

Решение

Получается эта строка:

config.DependencyResolver = new StructureMapDependencyResolver(container);

в классе вопроса XyzWebApiStructureMapContainerConfigurator вызвал некоторые проблемы.

Надеюсь, это поможет кому-то в будущем.

Была такая же проблема. Оказывается, 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);

Я столкнулся с той же проблемой с чванством, и мне потребовалось много часов, чтобы найти решение. Наконец-то получил. Добавьте атрибут [HttpGet] или [HttpPost] к каждому методу действия контроллера.

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

Вам необходимо подавить пользовательские заголовки для политики безопасности контента. Эти заголовки блокируют выполнение Swagger JS.

Прежде чем удалять заголовки

Прокомментированная политика безопасности контента

Пользовательский интерфейс Swagger с конечными точками после удаления заголовков

В моем случае проблема была вызвана виртуальным каталогом IIS Express, вот подробное объяснение:

У меня есть проект API, вот как выглядят свойства проекта:

Эти свойства записываются в файл applicationhost.config , расположенный по адресу:MySolutionPath\.vs\MySolution\config

Это раздел файла, в котором хранится информация о виртуальном каталоге:

      <sites>
  <site name="MyProject" id="3">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
      <virtualDirectory path="/" physicalPath="C:\MyProjectPath\MyProject" />
    </application>
    <bindings>
      <binding protocol="https" bindingInformation="*:44334:localhost" />
      <binding protocol="http" bindingInformation="*:53242:localhost" />
    </bindings>
  </site>
  ..
</sites>

Все работало нормально...

Затем я начал следовать этому руководству, в котором меня просили изменить URL-адрес проекта на:https://localhost:44334/Swagger

Я так и сделал, а затем нажал кнопку «Создать виртуальный каталог» .

При этом в файл applicationhost.config были внесены следующие изменения :

      <sites>
  <site name="MyProject" id="3">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
      <virtualDirectory path="/" physicalPath="C:\MyProjectPath\MyProject" />
    </application>
    <application path="/Swagger" applicationPool="Clr4IntegratedAppPool">
      <virtualDirectory path="/" physicalPath="C:\Shopless\shopless.source\Shopless.Api" />
    </application>
    <bindings>
      <binding protocol="https" bindingInformation="*:44334:localhost" />
      <binding protocol="http" bindingInformation="*:53242:localhost" />
    </bindings>
  </site>
  ..
</sites>

И в этом была проблема, потому что теперь путь /Swagger указывает на корень моего проекта.

Чтобы решить эту проблему, мне пришлось удалить новый раздел из файла applicationhost.config , а также изменить URL-адрес проекта на исходное значение.

Я понимаю, что это старая проблема, но я только что столкнулся с ней и у меня есть другое решение, отличное от уже предложенных. Я надеюсь, что это будет полезно для кого-то еще, у кого возникнет проблема.

Проблема была вызвана сканированием карты структуры. В моем классе Structuremap.Registry были следующие строки кода

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

Линия

scan.AssembliesFromApplicationBaseDirectory();

останавливал работу Swagger. Я изменил это на

      scan.AssembliesFromApplicationBaseDirectory(MyDllsPathFilter());

и теперь Swagger работает как положено.

Другие вопросы по тегам