【问题标题】:Azure Function, returning status code + JSON, without defining return in every part of logicAzure Function,返回状态码+JSON,逻辑的每一部分都没有定义return
【发布时间】:2019-02-25 02:28:35
【问题描述】:

我有一个 Azure Function 2.x,它驻留在一个看起来像这样的静态类中

[FunctionName("Register")]
public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "post")]HttpRequest req, ILogger log)
{
    MyTypeClass defReturn = new MyTypeClass();
    HttpStatusCode defCode = HttpStatusCode.BadRequest;

    /*
    * Logics that might or might not changes
    * defReturn and defCode value
    */

    return StatusCode((int) defCode, JsonConvert.SerializeObject(defReturn))
}

如何实现return StatusCode((int) defCode, JsonConvert.SerializeObject(defReturn)) 部分? Azure Functions 2.x 中是否有任何此类方法或等效方法?

在 Azure Functions 1.x 中,我可以使用 req.CreateResponse(defCode, defReturn) 进行等效操作,其中 reqHttpRequestMessage,但我试图坚持使用 2.x 模板/标准

附加说明:上述代码应返回HTTP 400 Bad RequestdefReturn 作为它对客户端的响应正文。但是当我将defCode 更改为HttpStatusCode.Accepted 时,它应该返回具有相同响应正文的HTTP 202 Accepted。我怎样才能做到这一点?

补充说明#2:(如果我没记错的话)在 ASP.NET Core 1.x 中我完全可以这样做,通过调用静态方法 StatusCode 而不是 StatusCodes(这是一个静态类)返回 IActionResult包含 HTTP 代码常量

谢谢

【问题讨论】:

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


    【解决方案1】:

    回复很晚,但我今天遇到了同样的问题,所以也许这对其他搜索者有帮助

    选项 1:默认代码

    这个在博客Here有详细说明

    200 和 400 等一些代码是预定义的,可供用户使用

    return new OkObjectResult("Your message"); // 200
    return new BadRequestObjectResult("Your error message"); // 400
    

    这些功能并非适用于所有已知的状态代码,而是一些最常用的。

    选项2:手动设置代码

    如果您需要特定的代码,默认情况下不提供,您可以使用基类并自己创建。

    例如,要实现茶壶响应,您可以使用

    using Microsoft.AspNetCore.Http;
    
    var result = new ObjectResult("Your message");
    result.StatusCode = StatusCodes.Status418ImATeapot;
    return result;
    

    在本例中,Statuscode 是从 StatusCodes 类中使用的,但您也可以使用输入其他代码(通常,只要坚持这些代码)

    如果需要,ObjectResult 类还提供其他格式选项。

    【讨论】:

      【解决方案2】:

      您可以创建一个模型类,您可以在其中定义两个属性,即一个形成您的状态代码,一个用于您的 Json 对象,稍后您可以返回完整的模型。代码示例如下:

      public static class QueueTriggerTableOutput
      {
          [FunctionName("QueueTriggerTableOutput")]
          [return: Table("outTable", Connection = "MY_TABLE_STORAGE_ACCT_APP_SETTING")]
          public static Person Run(
              [QueueTrigger("myqueue-items", Connection = "MY_STORAGE_ACCT_APP_SETTING")]JObject order,
              ILogger log)
          {
              return new Person() {
                      PartitionKey = "Orders",
                      RowKey = Guid.NewGuid().ToString(),
                      Name = order["Name"].ToString(),
                      MobileNumber = order["MobileNumber"].ToString() };
          }
      }
      
      public class Person
      {
          public string PartitionKey { get; set; }
          public string RowKey { get; set; }
          public string Name { get; set; }
          public string MobileNumber { get; set; }
      }

      在接收方面,您可以同时抓住这两个属性。

      P.S.- 您必须更改函数的返回类型。

      希望对你有帮助。

      【讨论】:

      • 嗨@MohitVerma-MSFT,谢谢你的回答。我从没想过要更改返回类型,但我可以知道,无论返回类型如何,我如何更改或配置响应的 HTTP 状态代码?谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 2018-07-09
      • 2020-01-03
      • 1970-01-01
      相关资源
      最近更新 更多