Как мне найти DataType T из метода действия контроллера?Например, ниже тип данных: GetBookResponse.
[HttpGet("[Action]/{id}")]
[ProducesResponseType(typeof(GetBookResponse), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(GetBookResponse), StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<GetBookResponse>> GetByBook(int id)
{
var book = await bookservice.GetBookById(id);
return Ok(book);
}
Я испробовал метод ниже, однако иногда он может давать ошибку.В поисках лучшего решения, возможно, с отражением.
Type returnType = action.ActionMethod.ReturnType.GenericTypeArguments[0].GetGenericArguments()[0];
В коде: Net Core API: Создайте глобальный параметр ProducesResponseType или автоматизируйте
public class ProduceResponseTypeModelProvider : IApplicationModelProvider
{
public int Order => 3;
public void OnProvidersExecuted(ApplicationModelProviderContext context)
{
}
public void OnProvidersExecuting(ApplicationModelProviderContext context)
{
foreach (ControllerModel controller in context.Result.Controllers)
{
foreach (ActionModel action in controller.Actions)
{
// I assume that all you actions type are Task<ActionResult<ReturnType>>
Type returnType = action.ActionMethod.ReturnType.GenericTypeArguments[0].GetGenericArguments()[0];
action.Filters.Add(new ProducesResponseTypeAttribute(StatusCodes.Status510NotExtended));
action.Filters.Add(new ProducesResponseTypeAttribute(returnType, StatusCodes.Status200OK));
action.Filters.Add(new ProducesResponseTypeAttribute(returnType, StatusCodes.Status500InternalServerError));
}
}
}
}
ВЗапуск:
public void ConfigureServices(IServiceCollection services)
{
...
services.TryAddEnumerable(ServiceDescriptor.Transient<IApplicationModelProvider, ProduceResponseTypeModelProvider>());
...
}
"System.IndexOutOfRangeException: 'Индекс находился за пределами массива.'"
Обновление: После рекомендации это не удалось в коде ниже.Контроллер не имеет возвращаемого типа и, следовательно, может не требовать типа ответа.Я буду работать над разрешением кода для этого с нулевым решением, для кода в верхней части вопроса.Любой может свободно переписать на месте в ответ, спасибо
Net Core API: сделать ProducesResponseType глобальным параметром или автоматизировать
[HttpGet("{id}/Attachment")]
public async Task<IActionResult> DownloadDocumentAttachment(int id)
{
var attachment = await noteDocumentService.GetDocumentAttachment(id);
if(attachment == null)
{
return NotFound();
}
return File(attachment.FileStream, attachment.FileContentType, attachment.FileName);
}