在.NET 5中将IActionResult与Azure函数一起使用?

jogvjijk  于 2023-03-03  发布在  .NET
关注(0)|答案(5)|浏览(127)

在将我的Azure Functions项目迁移到.NET 5之后,它开始将我的响应 Package 在一个奇怪的 Package 器类中。
例如,考虑以下终点:

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"));
}

以前,它会返回:

{
    "someValue": "hello world"
}

但现在,它回来了:

{
  "Value": {
    "SomeValue": "hello world"
  },
  "Formatters": [],
  "ContentTypes": [],
  "DeclaredType": null,
  "StatusCode": 200
}

我知道这一定是因为它只是试图序列化对象结果,但我找不到任何文档说明这应该如何在.NET 5中工作。
我的主函数现在看起来像这样:

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();
}

我的项目位于这里,如果有人感兴趣:https://github.com/sponsorkit/sponsorkit.io
目前,我的.NET 5工作在一个名为feature/signup-flow的分支。

sxissh06

sxissh061#

在. NET 5中将IActionResult与Azure函数一起使用?
在. NET 5中,您无法使用Azure Functions返回IActionResult。或者更一般地说,您无法使用隔离进程模型使用Azure Functions返回IActionResult
对于HTTP触发器,必须使用HttpRequestData和HttpResponseData来访问请求和响应数据。这是因为在进程外运行时,您无权访问原始HTTP请求和响应对象。
您需要返回HttpResponseData,而不是IActionResult。示例代码为here

fruv7luv

fruv7luv2#

要从.NET 5 Azure Functions返回对象,请使用以下代码:

var response = req.CreateResponse(HttpStatusCode.OK);
await response.WriteAsJsonAsync(obj);
return response;
vybvopom

vybvopom3#

对于带有.NET 7的Azure函数,我们可以直接从函数返回List或Object,并让运行时处理JSON序列化。
可能需要调整全局JSON设置来设置camelCase等。

nfg76nw0

nfg76nw04#

我惊喜地发现从“dotnet-isolated”函数返回Task在Core 6中有效。节省了我几个小时,因为我不需要在许多函数中更改为Task

klr1opcd

klr1opcd5#

在四处搜索并希望停留在IActionResult对象的上下文中之后,我最终利用了ObjectResult对象,以便可以使用标准化JSON消息来标准化所有服务响应。

相关问题