Search code examples
c#asp.netjsonswagger

c# System not supported exception after successful api request


I am using a ASP.NET .net7.0 solution and am trying to get the result of request, which for some reason seems to keep throwing an error as shown below. I have no 'Action' type in the solution. The request completes successfully and in the API Base Controller says success and returns OK. But the swagger UI displays the below:

Error:

System.NotSupportedException: Serialization and deserialization of 'System.Action' instances are not supported. Path: $.MoveNextAction. ---> System.NotSupportedException: Serialization and deserialization of 'System.Action' instances are not supported.

[ApiController]
[Route("[controller]")]
public class SyntaxBuilderController : ApiBaseController
{
    private readonly ILogger<SyntaxBuilderController> _logger;

    public SyntaxBuilderController(ILogger<SyntaxBuilderController> logger)
    {
        _logger = logger;
    }


    [HttpGet(Name = "executeSyntaxBuilder")]
    public async Task<ActionResult<ServiceResult<SyntaxesDto>>> GetSyntaxes([FromQuery] ExecuteSyntaxBuilder query, CancellationToken cancellationToken)
    {
        return await Handle(Mediator.Send(query, cancellationToken));
    }
}

Base Controller:

ApiController]
[Route("api/v{version:apiVersion}/[controller]")]
public class ApiBaseController : ControllerBase
{
    private ISender _mediator;
    protected ISender Mediator => GetMediator();

    protected async virtual Task<ActionResult<ServiceResult<T>>> Handle<T>(Task<ServiceResult<T>> serviceResult)
    {
        var result = await serviceResult;
        if (result.Succeeded)
        {
            return Ok(serviceResult);
        }
        return Problem(detail: $"{result.Error.Message}. Internal error code: {result.Error.Code}.", statusCode: 400);
    }

    private  ISender GetMediator()
    {
        if(_mediator == null)
        {
            _mediator = HttpContext.RequestServices.GetService<ISender>();
        }
        return _mediator;
    }
}

Syntaxes Dto

public class SyntaxesDto
{
    public string Syntax { get; set; } = "test";
}

Solution

  • in ApiBaseController i adjusted the 'Handle' method to send in the awaited result not serviceResult object, which was not awaited.

    protected async virtual Task<ActionResult<ServiceResult<T>>> Handle<T>(Task<ServiceResult<T>> serviceResult)
    {
        var result = await serviceResult;
        if (result.Succeeded)
        {
            return Ok(result);
        }
        return Problem(detail: $"{result.Error.Message}. Internal error code: {result.Error.Code}.", statusCode: 400);
    }