在WebAPI中HttResponseMessage作为消息返回,而在ApiController中我们经常讲四类数据作为返回值,void,object(可序列化),IHttpActionResult,HttpResponseMessage,

Void与object

Void:返回状态码200,无数据

Object: 返回状态码200,数据

IHttpActionResult

    public interface IHttpActionResult
{ Task<System.Net.Http.HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
}
}

  

WebAPI为我们定义了一IHttpActionResult接口,从命名我们就可以来它是作为Action执行的返回结果。

在WebAPI总已经定义了很多实现了IHttpActionResult的类:

这些类大致可以分为:只有状态码,重定向,实体序列化,错误信息,201Created等几类。

状态码

CodeStatusResult:指定状态码

BadRequestResult:400

OkResult:200

NotFoundResult:404

UnAuthorizedResult:401

ConflictResult:409

InternalServerErrorResult:500

重定向

状态码302,并返回重定向url

RedirectResult:按绝对路径

RedirectToRouteResult:按路由

WebApi为我们提供了一个UrlHelp类,可实现路由向绝对路径的转换

            IDictionary<string, object> route = new Dictionary<string, object>();
UrlHelper helper = new UrlHelper(Request);
route["controller"] = "Figure";
route["action"] = "GetAll";
string AbsoluteUrl = helper.Link("DefaultApi", route);

  

实体序列化

FormattedContentResult<T>:自定义序列化方式与状态码

NegotiatedContentResult<T>:自定义状态码,根据请求头信息匹配序列化类型

OkNegotiatedContentResult<T>:状态码200,根据请求头信息匹配序列化类型

JsonResult<T>:状态码200,Json序列化

错误信息

ExceptionResult:500, eg: {"Message":"出现错误。","ExceptionMessage":"未实现该方法或操作。","ExceptionType":"System.NotImplementedException","StackTrace":null}

BadRequestErrorMessageResult:400,eg: {"Message":"Error"}

InvalidModelStateResult:400,Model绑定错误,eg: {"Message":"请求无效。","ModelState":{"argument":["值不在预期的范围内。"],"implemented":["未实现该方法或操作。"]}}

这三种类型最终都是装换成HttpError

201 Created

CreatedNegotiatedContentResult<T>与CreatedAtRouteNegotiatedContentResult<T>

返回"201 Created"的状态。

同时ApiController也为我们定义许多返回IHttpActionResult的方法

public abstract class ApiController
    {
       
        protected internal virtual InvalidModelStateResult BadRequest(ModelStateDictionary modelState);
 
        protected internal virtual NegotiatedContentResult<T> Content<T>(HttpStatusCode statusCode, T value);
    
        protected internal FormattedContentResult<T> Content<T>(HttpStatusCode statusCode, T value, MediaTypeFormatter formatter);
     
        protected internal virtual FormattedContentResult<T> Content<T>(HttpStatusCode statusCode, T value, MediaTypeFormatter formatter, MediaTypeHeaderValue mediaType);
     
        protected internal FormattedContentResult<T> Content<T>(HttpStatusCode statusCode, T value, MediaTypeFormatter formatter, string mediaType);
     
        protected internal CreatedNegotiatedContentResult<T> Created<T>(string location, T content);
     
        protected internal virtual CreatedNegotiatedContentResult<T> Created<T>(Uri location, T content);
    
        protected internal virtual CreatedAtRouteNegotiatedContentResult<T> CreatedAtRoute<T>(string routeName, IDictionary<string, object> routeValues, T content);
    
        protected internal CreatedAtRouteNegotiatedContentResult<T> CreatedAtRoute<T>(string routeName, object routeValues, T content);

protected internal virtual InternalServerErrorResult InternalServerError();
    
        protected internal virtual ExceptionResult InternalServerError(Exception exception);
    
        protected internal JsonResult<T> Json<T>(T content);
 
        protected internal JsonResult<T> Json<T>(T content, JsonSerializerSettings serializerSettings);
   
        protected internal virtual JsonResult<T> Json<T>(T content, JsonSerializerSettings serializerSettings, Encoding encoding);
     
        protected internal virtual NotFoundResult NotFound();
    
        protected internal virtual OkResult Ok();
   
        protected internal virtual OkNegotiatedContentResult<T> Ok<T>(T content);
    
        protected internal virtual RedirectResult Redirect(string location);

protected internal virtual RedirectResult Redirect(Uri location);
    
        protected internal virtual RedirectToRouteResult RedirectToRoute(string routeName, IDictionary<string, object> routeValues);
   
        protected internal RedirectToRouteResult RedirectToRoute(string routeName, object routeValues);
     
        protected internal virtual ResponseMessageResult ResponseMessage(HttpResponseMessage response);
      
        protected internal virtual StatusCodeResult StatusCode(HttpStatusCode status);
     
        protected internal virtual UnauthorizedResult Unauthorized(IEnumerable<AuthenticationHeaderValue> challenges);
     
        protected internal UnauthorizedResult Unauthorized(params AuthenticationHeaderValue[] challenges);
       
    }

HttpResponseMessage

HttpResponseMessage表示包括状态代码和数HTTP 响应消息。在整个WebAPI中HttpResponseMessage是作为最终的请求结果,自然HttpResponseMessag可以作为Action的返回结果。如果单从返回数据上看我们可以只关心状态码(StatusCode),内容(Content),头信息(Headers)。

    public class HttpResponseMessage : IDisposable
{
public HttpResponseMessage();
public HttpResponseMessage(HttpStatusCode statusCode); public HttpContent Content { get; set; }
public HttpResponseHeaders Headers { get; }
public HttpStatusCode StatusCode { get; set; } }

  

其实WebAPI定义了一个ResponseMessageResult,这个类实现了IHttpActionResult接口,这个类只重载了一个构造函数,定义了一个HttpResponseResult的属性

    public class ResponseMessageResult : IHttpActionResult
{ public ResponseMessageResult(HttpResponseMessage response); public HttpResponseMessage Response { get; } public virtual Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
}

  

其中WebAPI为我们定义很多HttpContent的派生类。

ByteArrayContent

FormUrlEncodedContent

MultipartContent

MultipartFormDataContent

StreamContent

StringContent

不管是Void,object,IHttpActionResult都将生成HttpResponseMessage。

IhttpActionResult接口中只定义了一个ExecuteAsync方法

Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);

所以IHttpActionResult可以很容易得到HttpResponseMessage

源码

Github: https://github.com/BarlowDu/WebAPI (API_3)

ASP.NET WebAPI 03 返回结果的更多相关文章

  1. ASP.Net WebAPI的返回值

    Asp.Net WebAPI服务函数的返回值主要可以分为void.普通对象.HttpResponseMessag.IHttpActionResult e四种,本文这里简单的介绍一下它们的区别. 一.返 ...

  2. Asp.Net WebApi接口返回值IHttpActionResult

    WebApi是微软在VS2012 MVC4版本中绑定发行的,webapi2.0同mvc5发行的 webapi一共有以下接口返回值 1.void无返回值2.IHttpActionResult Json( ...

  3. 使用ASP.Net WebAPI构建REST服务(三)——返回值

    Asp.Net WebAPI服务函数的返回值主要可以分为void.普通对象.HttpResponseMessag.IHttpActionResult e四种,本文这里简单的介绍一下它们的区别. 一.返 ...

  4. Asp.Net WebAPI配置接口返回数据类型为Json格式

    Asp.Net WebAPI配置接口返回数据类型为Json格式   一.默认情况下WebApi 对于没有指定请求数据类型类型的请求,返回数据类型为Xml格式 例如:从浏览器直接输入地址,或者默认的XM ...

  5. ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)

    要啥自行车,直接看手表 //返回基元类型 public string Get() { return "hello world"; } //返回复杂类型 public Person ...

  6. ASP.NET WEBAPI 简单CURD综合测试(asp.net MVC,json.net,sql基础存储过程和视图,sqlhelper,json解析)

    草图   真正的后端是不管前端是什么平台,用什么语言的,JSON格式的数据应该可以应对.用ASP.NET WEBAPI尝试做一个后端,实现最基本的CURD,业务逻辑和数据库操作都放在后端,前端只需要正 ...

  7. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  8. ASP.NET WebApi OWIN 实现 OAuth 2.0

    OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth 允许用户提供一个令牌, ...

  9. Asp.Net WebApi核心对象解析(上篇)

    生活需要自己慢慢去体验和思考,对于知识也是如此.匆匆忙忙的生活,让人不知道自己一天到晚都在干些什么,似乎每天都在忙,但又好似不知道自己到底在忙些什么.不过也无所谓,只要我们知道最后想要什么就行.不管怎 ...

随机推荐

  1. Linux 进程与线程一(创建-关闭线程)

    进程是一个实体.每一个进程都有他自己的内存地址段(heap,stack等等) 进程是执行中的程序. 程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体. 进程是操作系统中最基 ...

  2. discuz编码转换UTF8与GBK互转完美适合Discuz3.x系列

    由于一些网站通信编码的问题不得不把一直使用的网站编码由UTF8转为GBK,在转换过程中在官方看了很多方法,自己也都尝试了一些最后都没有能够成功,数据库的转换一直都是没有大问题,不存在丢失什么的,能看到 ...

  3. EBS 用户及其联系人的失效时间

    联系人失效时间还有一个SQL,从页面的联系人详情简化取得的,不如直接用pos_supplier_users_v视图 SELECT * FROM (SELECT NULL contact_req_id, ...

  4. Java系列:《Java核心技术 卷一》学习笔记,cchapter11 异常

    11.1.1 异常分类     如果一个程序出现了RuntimeException,那么就一定是你的问题. 11.1.2 声明已检测异常     如果子类覆盖了父类的一个方法,那么子类方法中声明的检查 ...

  5. [CareerCup] 6.1 Find Heavy Bottle 寻找重瓶子

    6.1 You have 20 bottles of pills. 19 bottles have 1.0 gram pills, but one has pills of weight 1.1 gr ...

  6. [CareerCup] 12.2 Find the Reason of Crash 找到程序崩溃的原因

    12.2 You are given the source to an application which crashes when it is run. After running it ten t ...

  7. GDB深入研究

    GDB深入研究 一.GDB代码调试 (一)GDB调试实例 在终端中编译一个示例C语言小程序,保存到文件 gdb-sample.c 中,用GCC编译之 #include <stdio.h> ...

  8. 报这个错 unrecognized selector sent to instance

    1.给一个对象赋空值: 2.调不存在的方法:3.数据类型不对.

  9. 学习笔记——Maven 命令行选项

    2014-10-09:更新裁剪反应堆具体用法 说明: 1.使用-选项时,和后面的参数之间可以不要空格.而使用--选项时,和后面的参数之    间必须有空格.如下面的例子: $ mvn help:des ...

  10. 解决方法:未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序

    win7或win8 64位调试程序,出现这样的错误提示:未在本地计算机上注册 Microsoft.Jet.OLEDB.4.0 提供程序 解决方法如下: 方法一:“设置应用程序池默认属性”/“常规”/” ...