Azure函数在Http响应中返回字符串

Rob*_*man 5 c# asp.net-mvc azure-functions

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

我有以下 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"
Run Code Online (Sandbox Code Playgroud)

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

我尝试了以下方法

return result != null ? New OkObjectResult(result) : new StatusCodeResult(500);
Run Code Online (Sandbox Code Playgroud)

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

{
  "Value": "content of result variable here",
  "Formatters": [],
  "ContentTypes": [],
  "DeclaredType": null,
  "StatusCode": 200
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

And*_*son 10

通过新的“隔离”模型,您的应用程序现在在与函数主机不同的进程中运行。微软提供了一系列在进程外运行时的好处,其中关键的好处是能够将不同版本的 dll 提供给函数宿主,而不会在运行时发生冲突(这是我过去必须经常处理的事情) )。

由于您的应用程序作为主机的单独进程运行,因此您不能仅返回对象引用作为函数的输出。该对象必须被序列化,才能发送回主机进程。这意味着输入和输出绑定不能是函数对象,只能是可序列化的数据,因此大多数输入和输出绑定(包括 IActionResult)都已被简化。默认情况下,如果您尝试返回一个对象,它将被序列化为 json,这就是您 return 时看到的内容new OkObjectResult(result)。如果你想显式地序列化它,你需要 return 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 您不需要执行序列化行。您可以将字符串直接传递给 `WriteString` 方法。 (3认同)
  • 当然。供参考。还有一个“WriteAsJsonAsync”,可用于 JSON 输出。 (3认同)