【问题标题】:Using IActionResult with Azure Functions in .NET 5?在 .NET 5 中将 IActionResult 与 Azure Functions 一起使用?
【发布时间】:2021-07-06 18:23:56
【问题描述】:

将我的 Azure Functions 项目迁移到 .NET 5 后,它开始将我的响应包装在一个奇怪的包装类中。

例如,考虑以下端点:

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 的分支上。

【问题讨论】:

  • 只返回没有包裹在 OkResult 中的记录

标签: c# azure asp.net-core azure-functions


【解决方案1】:

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

can't return IActionResult with Azure Functions in .NET 5。或者更一般地,您不能使用隔离进程模型通过 Azure Functions 返回 IActionResult。引用文档:

对于 HTTP 触发器,您必须使用 HttpRequestData 和 HttpResponseData 来访问请求和响应数据。这是因为在进程外运行时您无权访问原始 HTTP 请求和响应对象。

您需要返回HttpResponseData,而不是IActionResult。示例代码为here

【讨论】:

  • 乍一看,这似乎是一种疯狂的妥协。有没有办法解决这个问题?我真的很不想失去我所有的强类型等等。
  • @MathiasLykkegaardLorenzen:我不确定。我希望随着时间的推移会提供更好的支持 API。 .NET 的隔离进程模型现在非常新 (one month)。我还没有采用它,因为我需要持久的功能,目前还不支持。
  • 这是一个非常简单的示例 - 只是返回一个字符串。对象和对象列表呢?所以你必须在发送之前反序列化任何对象?
  • @inliner49er:现在,是的。许多 ASP.NET 管道帮助器尚不可用。诸如序列化和内容协商之类的东西你必须自己构建。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-06-04
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2016-11-13
    • 2021-05-03
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多