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
}
В моем случае проблема была вызвана виртуальным каталогом 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 работает как положено.