【问题标题】:Azure Function Return String in Http ResponseHttp 响应中的 Azure 函数返回字符串
【发布时间】:2021-09-13 04:23:58
【问题描述】:

这看起来很简单,但我猜语法/库已经改变了很多次,找到一个样本就像试图在一大碗肉酱中追踪意大利面条的整个路径。

我有以下 C# dotnet 5 Azure 函数:

public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequestData req,
            ILogger log)

string result = "for the love of god, I just want to return this string"

我想返回带有 200 响应码的“结果”字符串。

我尝试了以下

return result != null ? New OkObjectResult(result) : new StatusCodeResult(500);

但不是返回一个字符串,而是返回:

{
  "Value": "content of result variable here",
  "Formatters": [],
  "ContentTypes": [],
  "DeclaredType": null,
  "StatusCode": 200
}

有什么想法吗?

【问题讨论】:

  • new OkObjectResult(result)
  • 文档确实显示了返回字符串的示例:docs.microsoft.com/en-us/azure/azure-functions/…
  • @AndrewWilliamson 感谢您的评论,请查看有问题的更新
  • 多么奇怪,它看起来像是将 ObjectResult 序列化为 json 并返回它。您是否尝试过直接从函数中返回字符串而不包装它?
  • 哦,还有一个非常重要的问题 - 您是否使用新的“隔离”模型,它将您的函数应用程序作为函数调度程序的单独应用程序运行?这可以解释这种行为,所以如果是这种情况,我会添加一个答案

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


【解决方案1】:

使用新的“隔离”模型,您的应用程序现在在函数宿主的单独进程中运行。微软在进程外运行时提供list of benefits,主要好处是能够为函数主机提供不同版本的dll,而不会在运行时发生冲突(这是我过去经常不得不处理的事情) )。

由于您的应用程序作为主机的单独进程运行,因此您不能只返回对象引用作为函数的输出。该对象必须被序列化,才能被发送回主机进程。这意味着输入和输出绑定不能是函数对象,只能是可序列化的数据,所以most of the input and output bindings (including IActionResult) have been simplified。默认情况下,如果您尝试返回一个对象,它将被序列化为 json,这就是您在返回 new OkObjectResult(result) 时所看到的。如果要显式序列化,则需要返回HttpResponseData,而且比之前涉及的要多得多:

[Function("HttpFunction")]
public static HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequestData req)
{
    var json = JsonConvert.SerializeObject("for the love of god, I just want to return this string");
    var response = req.CreateResponse(HttpStatusCode.OK);
    response.Headers.Add("Content-Type", "text/json; charset=utf-8");
    response.WriteString(json);
    return response;
}

【讨论】:

  • 非常感谢安德鲁的详细回答。我已经完成了一天的工作,但会在早上第一件事尝试您的建议。
  • 你不需要做序列化行。您可以将字符串直接传递给WriteString 方法。
  • @Shyju,是的,你可以,只是要注意它将以纯文本 foo 的形式返回,而不是 json "foo"。如果您期望 json 输出,则需要序列化为 json
  • 当然。供参考。还有一个 WriteAsJsonAsync 可用于 JSON 输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2021-09-21
  • 1970-01-01
  • 2021-09-29
  • 2020-12-01
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多