ASP.NET Core - Swashbuckle не создает файл swagger.json
У меня возникли проблемы с получением пакета Swashbuckle.AspNetCore(1.0.0) для создания любого результата. Я прочитал файл swagger.json, который должен быть записан в '~/swagger/docs/v1'. Однако я не получаю никаких результатов.
Я начал работу с совершенно нового проекта ASP API Core API. Я бы сказал, это ASP.NET Core 2. API работает, и я могу получить значения из контроллера значений просто отлично.
Мой класс запуска имеет конфигурацию, точно описанную в этой статье (Swashbuckle.AspNetCore on GitHub).
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
// Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAPI V1");
});
}
else
{
app.UseExceptionHandler();
}
app.UseStatusCodePages();
app.UseMvc();
//throw new Exception();
}
}
Вы можете увидеть ссылки NuGet...
Опять же, это все шаблон по умолчанию, но я включаю ValuesController для справки...
[Route("api/[controller]")]
public class ValuesController : Controller
{
// GET api/values
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}
// POST api/values
[HttpPost]
public void Post([FromBody]string value)
{
}
// PUT api/values/5
[HttpPut("{id}")]
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
[HttpDelete("{id}")]
public void Delete(int id)
{
}
}
Ответы
Ответ 1
Я считаю, что вы пропустили эти две строки на своем Configure:
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
// Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAPI V1");
});
}
Чтобы получить доступ к пользовательскому интерфейсу Swagger, URL-адрес должен быть следующим: http://localhost: XXXX/swagger/
Json можно найти в верхней части интерфейса Swagger:
Ответ 2
#if DEBUG
// For Debug in Kestrel
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Web API V1");
#else
// To deploy on IIS
c.SwaggerEndpoint("/webapi/swagger/v1/swagger.json", "Web API V1");
#endif
При развертывании в IIS webapi (базовый URL) используется псевдоним приложения. Вам необходимо сохранить псевдоним приложения (базовый URL-адрес) одинаковым для всех развертываний IIS, поскольку swagger ищет файл swagger.json в папке "/swagger/v1/swagger.json", но не использует префикс псевдонима приложения (базовый URL-адрес), поэтому он не будет работать,
Например:
localhost/swagger/v1/swagger.json - не удалось найти swagger.json
Ответ 3
У меня такая же проблема. Проверьте http://localhost: XXXX/swagger/v1/swagger.json. Если вы обнаружите какие-либо ошибки, исправьте их.
Например, у меня был неоднозначный маршрут в базовом классе контроллера, и я получил ошибку: "Неоднозначный HTTP-метод для действия. Действия требуют явной привязки HttpMethod для Swagger 2.0". Если вы используете базовые контроллеры, убедитесь, что ваши публичные методы используют атрибуты HttpGet/HttpPost/HttpPut/HttpDelete OR Route, чтобы избежать неоднозначных маршрутов.
Затем я также определил атрибуты HttpGet ("route") и Route ("route") в одном и том же методе, что было последней проблемой для swagger.
Ответ 4
Если ваше приложение размещено на IIS/IIS Express, попробуйте следующее:
c.SwaggerEndpoint("../swagger/v1/swagger.json", "MyAPI V1");
Ответ 5
Я столкнулся с подобным, но не совсем тем же вопросом с чванством. Надеюсь, это поможет кому-то другому.
Я использовал собственный заголовок документа и не менял путь к папке в SwaggerEndPoint, чтобы соответствовать названию документа. Если вы оставите конечную точку, указывающую на swagger/v1/swagger.json, он не найдет json файл в пользовательском интерфейсе swagger.
Пример:
services.AddSwaggerGen(swagger =>
{
swagger.SwaggerDoc("AppAdministration", new Info { Title = "App Administration API", Version = "v1.0" });
});
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/AppAdministration/swagger.json", "App Administration");
});
Ответ 6
Вы должны соответствовать 2 правилам:
- Украсьте все действия явными методами Http, такими как
[HttpGet("xxx")]
, [HttpPost("xxx")]
или... вместо [Route("xxx")]
.
- Украсьте открытые методы в контроллерах с помощью атрибута
[NoAction]
.
Обратите внимание, что http://localhost: XXXX/swagger/ страница запрашивает файл http://localhost: XXXX/swagger/v1/swagger.json, но из Чванство, если вы не будете соответствовать вышеуказанным правилам.
Ответ 7
После просмотра ответов и проверки рекомендаций я не понимаю, что происходит не так.
Я буквально все перепробовал. Так что, ребята, если вы окажетесь в той же ситуации, поймите, что проблема может быть в чем-то другом, совершенно неуместном от чванства.
В моем случае было исключение OData.
После того, как вы перейдете к localhost: xxxx/swagger, откройте инструменты разработчика, нажмите на ошибку на консоли, и вы увидите внутреннее исключение, которое вызывает проблему.
надеюсь, это поможет
Ответ 8
Если у вас есть какие-либо проблемы в вашем контроллере для сопоставления с уникальным URL, вы получите эту ошибку.
Лучший способ найти причину проблемы - исключить все контроллеры из проекта. Затем попробуйте запустить приложение, включив один контроллер или один или несколько методов в контроллере за раз, чтобы найти метод контроллеров/контроллеров (S), которые имеют проблему. Или вы могли бы проявить смекалку и выполнить бинарную логику поиска, чтобы найти отключение, включить несколько контроллеров/методов для поиска неисправных.
Некоторые из причин
Наличие открытых методов в контроллере без атрибутов HTTP-методов
Наличие нескольких методов с одинаковыми атрибутами Http, которые могут отображаться на один и тот же вызов API, если вы не используете отображение "[action]"
Ответ 9
Лично у меня была такая же проблема, и когда я снова попробовал сегодня через некоторое время, я нашел в новой версии (2.5.0), что в json я мог видеть объяснение ошибки, которая была здесь.
Еще одна вещь, которая помогла мне исправить это, - это удаление информации о хостинге, связанной с веб-сайтом, хранящимся внутри "..vs\config\applicationhost.config" в корне папки решений
Я удалил элемент, который настраивал веб-сайт.
<site name="**" id="9">
<application path="/" applicationPool=""></application>
<bindings></bindings>
</site>
Ответ 10
Распространенная ошибка, которую мы допускаем при использовании Swagger, заключается в присвоении (NET ASP) одного и того же имени двум или более маршрутам. По этой причине Swagger не может сгенерировать файл JSON. например, это неправильный путь
[HttpPost, Route("Start")]
public async Task<TransactionResult> WipStart(BodyWipStartDTO data)
{
return await _wipServices.WipStart(data);
}
Другое действие с тем же именем маршрута, но с другим именем действия
[HttpPost, Route("Start")]
public async Task<TransactionResult> WipAbort(BodyWipStartDTO data)
{
return await _wipServices.WipAbort(data);
}
Это правильный путь
[HttpPost, Route("Start")]
public async Task<TransactionResult> WipStart(BodyWipStartDTO data)
{
return await _wipServices.WipStart(data);
}
[HttpPost, Route("Abort")]
public async Task<TransactionResult> WipAbort(BodyWipStartDTO data)
{
return await _wipServices.WipAbort(data);
}
Ответ 11
Попробуйте выполнить эти шаги легко и чисто.
- Проверьте вашу консоль, нет ли ошибок типа "
Ambiguous HTTP method for action. Actions require an explicit HttpMethod binding for Swagger 2.0.
"
- Если ДА:
Причина этой ошибки: Swagger ожидает
каждая конечная точка должна иметь метод (get/post/put/delete)
Решение:
Пересмотрите ваш каждый контроллер и убедитесь, что вы добавили ожидаемый метод.
(или вы можете просто увидеть в консоли ошибку, какой контроллер вызывает неоднозначность)
- Если НЕТ. Пожалуйста, дайте нам знать вашу проблему и решение, если вы нашли.
Ответ 12
Я столкнулся с той же проблемой и заметил, что мой API не размещен в корневой папке и в виртуальном каталоге. Я переместил свой API в корневую папку в IIS и работал.
Дополнительная информация в этом ответе
Ответ 13
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("./v1/swagger.json", "My API V1");
});
Ответ 14
Убедитесь, что у вас есть все необходимые зависимости, перейдите по ссылке xxx/swagger/v1/swagger.json, в которой вы можете обнаружить, что у вас отсутствует одна или несколько зависимостей.
Ответ 15
Я получал эту ошибку Swagger, когда я создал версию 2 моего API, используя заголовки версий вместо URL-версий. Обходным решением было добавить атрибуты [Obsolete]
в методы версии 1, а затем использовать SwaggerGeneratorOptions
, чтобы игнорировать устаревшие методы API в методе Startup
→ ConfigureServices
.
services.AddSwaggerGen(c =>
{
c.SwaggerGeneratorOptions.IgnoreObsoleteActions = true;
c.SwaggerDoc("v2", new Info { Title = "My API", Version = "v2" });
});
Ответ 16
Взгляните на инструменты разработчика Chrome, иногда, запрос swagger.json выдает http 500, ведь это означает, что на ваших контроллерах есть некоторая несогласованность.
Например: в моем случае есть "Неоднозначный HTTP-метод для действия":
Ответ 17
Также у меня возникла проблема, потому что я управлял версией приложения на уровне IIS, как показано ниже:
В этом случае конфигурация в методе Configure должна добавить номер версии, как показано ниже:
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/1.0/swagger/V1/swagger.json", "Static Data Service");
});
Ответ 18
У меня была эта проблема, когда я использовал внутренний класс в параметрах сообщения
[HttpPost]
public async Task Post([FromBody] Foo value)
{
}
Где находится Foo
public class Foo
{
public IEnumerable<Bar> Bars {get;set;}
public class Bar
{
}
}
Ответ 19
Я смог исправить и понять свою проблему, когда попытался перейти по адресу URL swagger.json:
https://localhost:XXXXX/swagger/v1/swagger.json
На странице будет отображена ошибка и причина, по которой она не найдена.
В моем случае я обнаружил неправильно настроенное XML-определение одного из моих методов на основе возвращенной ошибки:
NotSupportedException: HTTP method "GET" & path "api/Values/{id}" overloaded by actions - ...
...
...