Después de migrar mi proyecto de Azure Functions a .NET 5, comenzó a envolver mis respuestas en una clase contenedora extraña.
Por ejemplo, considere el siguiente punto final:
public record Response(string SomeValue); [Function("Get")] public async Task<IActionResult> Get( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "get-something")] HttpRequestData request) { return new OkObjectResult(new Response("hello world")); }Antes, devolvería:
{ "someValue": "hello world" }Pero ahora, vuelve:
{ "Value": { "SomeValue": "hello world" }, "Formatters": [], "ContentTypes": [], "DeclaredType": null, "StatusCode": 200 }Entiendo que debe ser porque solo intenta serializar el resultado del objeto, pero no puedo encontrar ninguna documentación sobre cómo se supone que funciona esto en .NET 5.
Mi función principal actualmente se ve así:
public static async Task Main() { var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults(x => x.UseDefaultWorkerMiddleware()) .ConfigureAppConfiguration((_, builder) => builder .AddJsonFile("local.settings.json", true) .Build()) .ConfigureServices(ConfigureServices) .Build(); await host.RunAsync(); }Mi proyecto se encuentra aquí, en caso de que alguien esté interesado: https://github.com/sponsorkit/sponsorkit.io
Actualmente, mi trabajo de .NET 5 está en una rama llamada feature/signup-flow .
¿Utiliza IActionResult con Azure Functions en .NET 5?
No puede devolver IActionResult con Azure Functions en .NET 5 . O, de manera más general, no puede devolver IActionResult con Azure Functions mediante el modelo de proceso aislado. Cita de los documentos:
Para desencadenadores HTTP, debe usar HttpRequestData y HttpResponseData para acceder a los datos de solicitud y respuesta. Esto se debe a que no tiene acceso a los objetos de solicitud y respuesta HTTP originales cuando se ejecuta fuera del proceso.
En lugar de IActionResult , debe devolver HttpResponseData . El código de ejemplo está aquí .
Para devolver un objeto de .NET 5 Azure Functions, use el siguiente código:
var response = req.CreateResponse(HttpStatusCode.OK); await response.WriteAsJsonAsync(obj); return response;