Azure Functions - 返回类型 HttpResponseMessage 和 IActionResult 之间的区别

Posted

技术标签:

【中文标题】Azure Functions - 返回类型 HttpResponseMessage 和 IActionResult 之间的区别【英文标题】:Azure Functions - Difference between return type HttpResponseMessage and IActionResult 【发布时间】:2020-09-26 05:33:54 【问题描述】:

我创建了 Http Trigger Azure Function,它的默认返回类型是Task<IActionResult>

如果我改成Task<HttpResponseMessage>有什么不同吗?

带有Task<IActionResult>返回类型的Azure函数:

 public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,

带有Task&lt;HttpResponseMessage&gt;的Azure函数

 public static async Task<HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]
            HttpRequestMessage message,

【问题讨论】:

查看此链接,希望对您的请求有所帮助。 Why should I use IHttpActionResult instead of HttpResponseMessage? 【参考方案1】:

如果我把Task&lt;IActionResult&gt;改成Task&lt;HttpResponseMessage&gt;有什么不同吗?

您可以使用Task&lt;HttpResponseMessage&gt; 作为函数的返回类型。执行起来应该没有问题。

话虽如此,使用两者的区别在于您从函数返回响应的方式。

如果是IActionResult 类型的响应,则代码较少 在构建响应时编写并进行单元测试 更简单。 另一方面,HttpResponseMessage 对 通过网络发送的 Http 响应消息。

顺便说一句,

HttpTrigger Azure 函数v1.0 中,类型Task&lt;HttpResponseMessage&gt;HttpRequestMessage 分别用作返回类型和请求类型的默认值。

v2.0 开始,Task&lt;IActionResult&gt;HttpRequest 类型分别用作默认返回类型和请求类型,因为它符合 .net 核心 API 结构。

【讨论】:

【参考方案2】:

使用IHttpActionResult 接口有两个主要优点。

    代码更简洁易读 单元测试控制器操作方法要简单得多。我们将 讨论,对返回的方法进行单元测试是多么容易 在稍后的视频中使用 IHttpActionResult 而不是 HttpResponseMessage。

你可以在这里看到。

static List<Student> students = new List<Student>()

    new Student()  Id = 1, Name = "Tom" ,
    new Student()  Id = 2, Name = "Sam" ,
    new Student()  Id = 3, Name = "John" 
;

public IHttpActionResult Get()

    return Ok(students);



public HttpResponseMessage Get(int id)

    var student = students.FirstOrDefault(s => s.Id == id);
    if (student == null)
    
        return Request.CreateErrorResponse(HttpStatusCode.NotFound,
            "Student not found");
    

    return Request.CreateResponse(student);

所有这些方法都返回一个实现IHttpActionResult接口的类型。

BadRequest()
Conflict()
Created()
InternalServerError()
Redirect()
Unauthorized()

我参考了这个链接https://csharp-video-tutorials.blogspot.com/2017/02/ihttpactionresult-vs-httpresponsemessage.html

【讨论】:

以上是关于Azure Functions - 返回类型 HttpResponseMessage 和 IActionResult 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

发布函数时未返回 Azure Functions V2 Http 错误代码内容

如何从 Azure 移动应用服务调用 HTTP(Azure Functions)?

我可以使用 Azure Functions 进行 SQL 查询并返回其结果吗? [关闭]

Azure Functions HTTP 触发器:如何将异常从 python 工作日志返回给 API 调用者

Azure Functions 突然找不到入口点错误

Azure Functions 2 - 如何控制json序列化设置