如果不想写代码直接使用nuget安装笔者已经封装好的就可以马上实现(nuget搜索ZetaWebApi)选择>=1.0.1版本-----不懂使用nuget的请查看笔者的nuget系列文章

如果习惯自己写代码请继续往下看

先创建要返回的结果类型:

  1. /// <summary>
  2. /// 返回类型
  3. /// </summary>
  4. public class ApiResultModel
  5. {
  6. private HttpStatusCode statusCode;
  7.  
  8. private object data;
  9.  
  10. private string errorMessage;
  11.  
  12. private bool isSuccess;
  13.  
  14. /// <summary>
  15. /// 状态代码
  16. /// </summary>
  17. public HttpStatusCode StatusCode
  18. {
  19. get { return statusCode; }
  20. set { statusCode = value; }
  21. }
  22.  
  23. /// <summary>
  24. /// 返回的数据
  25. /// </summary>
  26. public object Data
  27. {
  28. get { return data; }
  29. set { data = value; }
  30. }
  31.  
  32. /// <summary>
  33. /// 错误消息
  34. /// </summary>
  35. public string ErrorMessage
  36. {
  37. get { return errorMessage; }
  38. set { errorMessage = value; }
  39. }
  40.  
  41. /// <summary>
  42. /// 是否成功
  43. /// </summary>
  44. public bool IsSuccess
  45. {
  46. get { return isSuccess; }
  47. set { isSuccess = value; }
  48. }
  49. }

然后创建重写ActionFilterAttribute下的OnActionExecuted(执行action之后):

先建一个类名字随意如:ApiResultAttribute继承于System.Web.Http.Filters.ActionFilterAttribute详细代码如下:

以下代码需注意要引用using System.Net.Http否则ReadAsAsync不能使用

  1. public class ApiResultAttribute : System.Web.Http.Filters.ActionFilterAttribute
  2. {
  3. public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
  4. {
  5.  
  6. base.OnActionExecuted(actionExecutedContext);
  7.  
  8. ApiResultModel result = new ApiResultModel();
  9.  
  10. // 取得由 API 返回的状态代码
  11. result.StatusCode = actionExecutedContext.ActionContext.Response.StatusCode;
  12.  
  13. // 取得由 API 返回的资料
  14. result.Data = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>().Result;
  15.  
  16. //请求是否成功
  17. result.IsSuccess = actionExecutedContext.ActionContext.Response.IsSuccessStatusCode;
  18.  
  19. //结果转为自定义消息格式
  20. HttpResponseMessage httpResponseMessage = JsonHelper.toJson(result);
  21.  
  22. // 重新封装回传格式
  23. actionExecutedContext.Response = httpResponseMessage;
  24.  
  25. }
  26. }

上面的JsonHelper.toJson()是事先写好的代码如下:创建类JsonHelper

  1. public static HttpResponseMessage toJson(Object obj)
  2. {
  3. String str;
  4. if (obj is String || obj is Char)//如果是字符串或字符直接返回
  5. {
  6. str = obj.ToString();
  7. }
  8. else//否则序列为json字串
  9. {
  10. JavaScriptSerializer serializer = new JavaScriptSerializer();
  11. str = serializer.Serialize(obj);
  12. }
  13. HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };
  14. return result;
  15. }

建完之后在WebApiConfig下注册:

  1. config.Filters.Add(new ApiResultAttribute());//重新包装结果

完成以上步骤即可使用。

补充:

特殊情况不需要封装返回结果,解决方法:

1创建一个自定义属性

假设自定义类名为NoPackageResult继承Attribute

  1. public class NoPackageResult : Attribute
  2. {
  3.  
  4. }

2,修改上面的ApiResultAttribute类里的OnActionExecuted方法

在方法里加一个判断是否有属性有的情况下就不做封装的步骤

  1. var noPackage = actionExecutedContext.ActionContext.ActionDescriptor.GetCustomAttributes<NoPackageResult>();
  2. if (!noPackage.Any())
  3. {
  4. //执行封装
  5. }

3在不需要封装的接口上添加属性NoPackageResult如下:

ApiResultAttribute类完整代码:

  1. public class ApiResultAttribute : System.Web.Http.Filters.ActionFilterAttribute
  2. {
  3. public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
  4. {
  5. base.OnActionExecuted(actionExecutedContext);
  6.  
  7. // 不包裹返回值
  8. var noPackage = actionExecutedContext.ActionContext.ActionDescriptor.GetCustomAttributes<NoPackageResult>();
  9. if (!noPackage.Any())
  10. {
  11. //初始化返回结果
  12. ApiResultModel result = new ApiResultModel();
  13. if (actionExecutedContext.Exception != null)
  14. {
  15. result.Code = "sys_error";
  16. result.Success = false;
  17. result.Message = actionExecutedContext.Exception.Message;
  18. }
  19. else
  20. {
  21. // 取得由 API 返回的状态代码
  22. result.Code = actionExecutedContext.ActionContext.Response.StatusCode.ToString();
  23.  
  24. var a = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>();
  25. if (!a.IsFaulted)
  26. {
  27. // 取得由 API 返回的资料
  28. result.Data = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>().Result;
  29. }
  30.  
  31. //请求是否成功
  32. result.Success = actionExecutedContext.ActionContext.Response.IsSuccessStatusCode;
  33. }
  34.  
  35. //结果转为自定义消息格式
  36. HttpResponseMessage httpResponseMessage = CustomerHttpResponseMessage.toJson(result);
  37.  
  38. // 重新封装回传格式
  39. actionExecutedContext.Response = httpResponseMessage;
  40. }
  41.  
  42. }
  43. }

WebApi(二)-重新封装返回结果的更多相关文章

  1. 3) drf 框架生命周期 请求模块 渲染模块 解析模块 自定义异常模块 响应模块(以及二次封装)

    一.DRF框架 1.安装 pip3 install djangorestframework 2.drf框架规矩的封装风格 按功能封装,drf下按不同功能不同文件,使用不同功能导入不同文件 from r ...

  2. 深入理解MVC C#+HtmlAgilityPack+Dapper走一波爬虫 StackExchange.Redis 二次封装 C# WPF 用MediaElement控件实现视频循环播放 net 异步与同步

    深入理解MVC   MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性 ...

  3. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  4. Quick Cocos (2.2.5plus)CoinFlip解析(MenuScene display AdBar二次封装)

    转载自:http://cn.cocos2d-x.org/tutorial/show?id=1621 从Samples中找到CoinFlip文件夹,复制其中的 res 和 script 文件夹覆盖新建工 ...

  5. 对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache

    虽然jquery的较新的api已经很好用了, 但是在实际工作还是有做二次封装的必要,好处有:1,二次封装后的API更加简洁,更符合个人的使用习惯:2,可以对ajax操作做一些统一处理,比如追加随机数或 ...

  6. 对jquery的ajax进行二次封装

    第一种方法: $(function(){ /** * ajax封装 * url 发送请求的地址 * data 发送到服务器的数据,数组存储,如:{"username": " ...

  7. volley二次封装

    产品中使用Volley框架已有多时,本身已有良好封装的Volley确实给程序开发带来了很多便利与快捷.但随着产品功能的不断增加,服务器接口的不断复杂化,直接使用Volley原生的JSONObjectR ...

  8. FMDB 二次封装工具类,让你快速学会封装,集成数据库

    来源:StrivEver 链接:http://www.jianshu.com/p/4c77aee0b41c 上个版本为了增加用户体验,部分页面集成了离线缓存数据功能,于是就在项目里使用了数据库管理离线 ...

  9. 本地缓存下载文件,download的二次封装

    来源:http://ask.dcloud.net.cn/article/524 源码下载链接 说明: (1)由于平时项目中大量用到了附件下载等功能,所以就花了一个时间,把plus的downlaod进行 ...

随机推荐

  1. 用APK Downloader直接从Google Play上下载apk

    APK Downloader可以直接从Google Play上下载apk,相比较其他软件,这个不需要提供Google ID,对于没有刷机的同学还是有些帮助的.

  2. 普通身份运行Tomcat

    普通身份运行Tomcat 转载1   权限分配问题 su - username -c “command”这样的形式可以使用任意一个有执行权限的用户执行 -c后边的命令. 注意,- username中间 ...

  3. (转)在javascript中关于submit和button提交表单区别

      原文来自:http://www.jb51.net/article/42236.htm   submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了,submit和b ...

  4. NDK开发之获得域和方法描述符

    在NDK开发之调用方法和NDK开发之访问域两篇博客中,我们在获得域ID和方法ID时都需要一个叫做描述符的参数,那么在实际开发中我们怎么知道我们要调用的域或者方法的描述符呢? 一个简单的方法就是使用Ja ...

  5. Chapter 5. The Gradle Wrapper 关于gradle wrapper

    Most tools require installation on your computer before you can use them. If the installation is eas ...

  6. Oracle存储过程中不支持DML语言的解决方法(针对遇见的DROP关键字)

    ---存储过程中的原语句: ---删除表 DROP TABLE A_NEWTDDATA; --报错 经查询:存储过程不支持DML语言: 解决方法: execute immediate 'DROP TA ...

  7. 转之农民伯伯 IHttpHandler中使用Session实现原理[ASP.NET | IHttpHandler |IRequiresSessionState]

    前言 在实现自己的Handler的时候只需要继承IHttpHandler接口就行了,在Handler中使用Session时,只需要继承一下IRequiresSessionState就行了,到底为什么只 ...

  8. [Mime] MediaTypes--电子邮件类型类 (转载)

    点击下载 MediaTypes.rar 这个类是关于 电子邮件类型类的操作,在发送电子邮件是规定以什么样的格式发送,Xml,HTML,文本等方式1.电子邮件类型帮助类,Xml格式,HTML格式等看下面 ...

  9. Android 网络视频播放器

    项目概要: 1.登录界面 2.播放列表 3.播放界面

  10. c语言学习之基础知识点介绍(八):函数的基本用法

    本节开始说函数. 一.函数的基本用法  /* 作用:可以实现代码的复用,在一定程度上解决代码冗余的问题:方便后期维护. 语法: void 函数名(){ 函数体; } 函数命名要有意义,遵守驼峰命名法. ...