猿教程 Logo

Action方法返回类型

在前面的部分中,您了解了参数绑定与Web API操作方法。在这里,您将了解操作方法的返回类型,返回数据是Web API对请求作出响应并发送到客户端的数据。

Web API操作方法后主要有以下几种返回类型:

  1. Void类型

  2. 简单类型或复杂类型

  3. HttpResponseMessage类型

  4. IHttpActionResult类型


Void

并不是所有的操作方法都必须要有返回数据。它可以有void返回类型。

例如下面的删除操作方法:从数据源中删除学生并返回。

public class StudentController : ApiController
{
    public void Delete(int id)
    {
        DeleteStudentFromDB(id);
    }
}

可以看到上面的删除操作方法返回void。

当你发送HTTP DELETE请求,它将返回204作为响应状态代码,如下所示。204的含义是“No Content”



简单或复杂类型

一个动作方法可以返回简单类型或其他自定义的复杂类型的数据。例如以下操作方法。

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class StudentController : ApiController
{
    public int GetId(string name)
    {
        int id = GetStudentId(name);
    
        return id;
    }
    public Student GetStudent(int id)
    {
        var student = GetStudentFromDB(id);
    
        return student;
    }
}

如你所见,GetId方法返回一个整数,GetStudent方法返回一个学生类型。


在Fiddler中,一个HTTP GET请求http://localhost:xxxx/api/student?name=john后将返回如下响应。


在Fiddler中,一个HTTP GET请求http://localhost:xxxx/api/student?id=1 后将返回如下响应。



HttpResponseMessage

Web API控制器总是返回一个HttpResponseMessage对象来托管基础设施。下图说明了整个Web API请求/响应管道。


访问Web API HTTP Message Life Cycle Poster获取更多的细节。


正如你在上面的图中所看到的,Web API控制器返回HttpResponseMessage对象。您还可以直接从一个动作方法创建并返回一个HttpResponseMessage对象。

从一个Actioin方法发送HttpResponseMessage的优点是,您可以自己配置一个响应。你可以按照您的需求设置状态代码,内容或错误消息(如果有的话)。

参考下面的例子。

public HttpResponseMessage Get(int id)
{
    Student stud = GetStudentFromDB(id); 
    if (stud == null) {
        return Request.CreateResponse(HttpStatusCode.NotFound, id);
    }
    return Request.CreateResponse(HttpStatusCode.OK, stud);
}


在上面的操作方法,如果在DB中指定id的Student数据,它将返回HTTP 404(没有找到)状态代码,否则会返回200 (OK)状态与学生数据。


例如,http GET请求http://localhost:xxxx/api/student?id=100后会得到如下响应,因为数据库中不存在id=100的学生信息。


同样,一个HTTP GET请求http://localhost:60464/api/student?id=1将得到id为1的学生信息,因为id = 1的学生信息存在于数据库中。



IHttpActionResult

IHttpActionResult是在Web API 2(.NET 4.5)中引入的。Web API 2的操作方法可以返回实现IHttpActionResult接口的类的对象,这种类型或多或少与Asp.Net MVC的ActionResult类型有几分相似。

你可以自己创建实现IHttpActionResult的类用于Web Api的操作方法返回,也可以直接调用ApiController的专门的方法来返回实现IHttpActionResult的类的对象。

public IHttpActionResult Get(int id)
{
    Student stud = GetStudentFromDB(id);  
    if (stud == null)
    {
        return NotFound();
    }
    return Ok(stud);
}


在上面的例子中,如果数据库中不存在指定的id的学生信息,那么它将返回响应状态码404,否则发送对应ID的学生数据和状态代码200作为响应。正如您可以看到的,我们不需要编写大量代码,因为NotFound()和OK()方法已经为我们做了这一切。

下表列出了ApiController类的所有用来返回一个实现IHttpActionResult接口的类的对象的方法。

ApiController方法描述
BadRequest()创建一个状态码为400的BadRequestResult对象
Conflict()创建一个状态码为409的ConflictResult对象
Content()创建一个指定状态码和数据的NegotiatedContentResult对象
Created()创建一个状态码为201 Created 的CreatedNegotiatedContentResult对象
CreatedAtRoute()创建一个状态码为201 Created的CreatedAtRouteNegotiatedContentResult对象
InternalServerError()创建一个状态码为500内部服务器错误的InternalServerErrorResult对象。
NotFound()创建一个状态码为404的NotFoundResult对象
Ok()创建一个状态码为200的OkResult对象。
Redirect()创建一个状态码为302的RedirectResult对象。
RedirectToRoute()创建一个状态码为302的RedirectToRouteResult对象。
ResponseMessage()创建了一个与指定的HttpResponseMessage的 ResponseMessageResult对象。
StatusCode()创建一个指定的http状态代码的StatusCodeResult对象。
Unauthorized()创建一个状态码为401的UnauthorizedResult对象。


访问MSDN了解ApiController的所有成员。



自定义返回类型

您可以创建自己的实现IHttpActionResult接口的自定义类类型。

下面的例子演示了如何实现IHttpActionResult类。

public class TextResult : IHttpActionResult
{
    string _value;
    HttpRequestMessage _request;
    public TextResult(string value, HttpRequestMessage request)
    {
        _value = value;
        _request = request;
    }
    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = new HttpResponseMessage()
        {
            Content = new StringContent(_value),
            RequestMessage = _request
        };
        return Task.FromResult(response);
    }
}

现在,您可以在操作方法中返回TextResult对象,如下所示。

public IHttpActionResult GetName(int id)
{
    string name = GetStudentName(id);
            
    if (String.IsNullOrEmpty(name))
    {
        return NotFound();
    }
            
    return new TextResult(name, Request);
}


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/webapi/action-method-returntype.html