Поведение отражения NSwagStudio с параметрами

#c# #json #openapi #nswag

#c# #json #openapi #nswag

Вопрос:

Я создаю простой веб-api .net5. Затем я получаю Nswag.aspnetcore от великого Рико Сутера и настраиваю его, чтобы заставить мое приложение создать файл swagger.json

В контроллере с каркасом я пишу другое действие PUT, которое ПРИНИМАЕТ параметр ОБЪЕКТА (самое простое, что я могу)

 [HttpPost]
public ActionResult simple(WeatherForecast w)
{
    return NoContent();
}
 

Все работает хорошо из коробки. Я могу найти в http://localhost:63630/swagger/v1/swagger.json файле.

Затем я использую NSwagStudio для получения прокси-сервера клиента C # с интерфейсами.

Со спецификацией OpenAPI я получу симпатичный интерфейс c #:

 [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.10.2.0 (NJsonSchema v10.3.4.0 (Newtonsoft.Json v12.0.0.0))")]
public partial interface IWeatherForecastClient
{
    /// <exception cref="ApiException">A server side error occurred.</exception>
    System.Threading.Tasks.Task<System.Collections.Generic.ICollection<WeatherForecast>> GetAsync();

    /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
    /// <exception cref="ApiException">A server side error occurred.</exception>
    System.Threading.Tasks.Task<System.Collections.Generic.ICollection<WeatherForecast>> GetAsync(System.Threading.CancellationToken cancellationToken);

    /// <exception cref="ApiException">A server side error occurred.</exception>
    System.Threading.Tasks.Task<FileResponse> SimpleAsync(WeatherForecast w);

    /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
    /// <exception cref="ApiException">A server side error occurred.</exception>
    System.Threading.Tasks.Task<FileResponse> SimpleAsync(WeatherForecast w, System.Threading.CancellationToken cancellationToken);

}
 

Теперь я буду использовать опцию NSwagStudio «Отражение WebAPI», Config:

  • Пути сборки .Net => . binDebugnet5.0WebApplication7.dll
  • Путь к ссылочным файлам сборки => .bin Debug net5.0
  • Проверьте, использует ли сборка ASP.NET Ядро

И интерфейс

 [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.10.2.0 (NJsonSchema v10.3.4.0 (Newtonsoft.Json v12.0.0.0))")]
public partial interface IWeatherForecastClient
{
    /// <exception cref="ApiException">A server side error occurred.</exception>
    System.Threading.Tasks.Task<System.Collections.Generic.ICollection<WeatherForecast>> GetAsync();

    /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
    /// <exception cref="ApiException">A server side error occurred.</exception>
    System.Threading.Tasks.Task<System.Collections.Generic.ICollection<WeatherForecast>> GetAsync(System.Threading.CancellationToken cancellationToken);

    /// <exception cref="ApiException">A server side error occurred.</exception>
    System.Threading.Tasks.Task<FileResponse> SimpleAsync(System.DateTimeOffset? date, int? temperatureC, int? temperatureF, string summary);

    /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
    /// <exception cref="ApiException">A server side error occurred.</exception>
    System.Threading.Tasks.Task<FileResponse> SimpleAsync(System.DateTimeOffset? date, int? temperatureC, int? temperatureF, string summary, System.Threading.CancellationToken cancellationToken);

}
 

Параметр в методе post был де-сконструирован!!

Вопрос в том, как я мог бы получить с отражением тот же интерфейс, что и с параметром спецификации OpenAPI?

Ответ №1:

Не используйте «отражение WebAPI» с ASP.NET Ядро, как оно есть, только для наследия ASP.NET (неосновной!). Использовать «ASP.NET Ядро через API Explorer», который также более или менее основан на отражении (загружает сборки или .csproj). Я рекомендую использовать .csproj в качестве входных данных вместо DLL… Если в DI не зарегистрирован документ NSwag, вы также можете указать конфигурацию через пользовательский интерфейс.