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

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

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

/// <summary>
/// 返回类型
/// </summary>
public class ApiResultModel
{
private HttpStatusCode statusCode; private object data; private string errorMessage; private bool isSuccess; /// <summary>
/// 状态代码
/// </summary>
public HttpStatusCode StatusCode
{
get { return statusCode; }
set { statusCode = value; }
} /// <summary>
/// 返回的数据
/// </summary>
public object Data
{
get { return data; }
set { data = value; }
} /// <summary>
/// 错误消息
/// </summary>
public string ErrorMessage
{
get { return errorMessage; }
set { errorMessage = value; }
} /// <summary>
/// 是否成功
/// </summary>
public bool IsSuccess
{
get { return isSuccess; }
set { isSuccess = value; }
}
}

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

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

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

 public class ApiResultAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{ base.OnActionExecuted(actionExecutedContext); ApiResultModel result = new ApiResultModel(); // 取得由 API 返回的状态代码
result.StatusCode = actionExecutedContext.ActionContext.Response.StatusCode; // 取得由 API 返回的资料
result.Data = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>().Result; //请求是否成功
result.IsSuccess = actionExecutedContext.ActionContext.Response.IsSuccessStatusCode; //结果转为自定义消息格式
HttpResponseMessage httpResponseMessage = JsonHelper.toJson(result); // 重新封装回传格式
actionExecutedContext.Response = httpResponseMessage; }
}

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

public static HttpResponseMessage toJson(Object obj)
{
String str;
if (obj is String || obj is Char)//如果是字符串或字符直接返回
{
str = obj.ToString();
}
else//否则序列为json字串
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
str = serializer.Serialize(obj);
}
HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };
return result;
}

建完之后在WebApiConfig下注册:

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

完成以上步骤即可使用。

补充:

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

1创建一个自定义属性

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

public class NoPackageResult : Attribute
{ }

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

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

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

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

ApiResultAttribute类完整代码:

public class ApiResultAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext); // 不包裹返回值
var noPackage = actionExecutedContext.ActionContext.ActionDescriptor.GetCustomAttributes<NoPackageResult>();
if (!noPackage.Any())
{
//初始化返回结果
ApiResultModel result = new ApiResultModel();
if (actionExecutedContext.Exception != null)
{
result.Code = "sys_error";
result.Success = false;
result.Message = actionExecutedContext.Exception.Message;
}
else
{
// 取得由 API 返回的状态代码
result.Code = actionExecutedContext.ActionContext.Response.StatusCode.ToString(); var a = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>();
if (!a.IsFaulted)
{
// 取得由 API 返回的资料
result.Data = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>().Result;
} //请求是否成功
result.Success = actionExecutedContext.ActionContext.Response.IsSuccessStatusCode;
} //结果转为自定义消息格式
HttpResponseMessage httpResponseMessage = CustomerHttpResponseMessage.toJson(result); // 重新封装回传格式
actionExecutedContext.Response = httpResponseMessage;
} }
}

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. 绿色tftpserver:tftpd32的配置

    嵌入式开发中少不了用到TFTP服务,它的功能主要是用来给目标板传输文件. tftpd32.exe是如今最经常使用的TFTPserver,今天就来介绍它的配置方法. 1.从这里 下载新版本号tftpd3 ...

  2. android常见错误-Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE

    在andorid进行调试的过程中,出现下面的错误: 解决方法: 修改一下应用程序描述符: <manifest xmlns:android="http://schemas.android ...

  3. LINUX系统全部参数 sysctl -a + 网络参数设置

    http://blog.lifeibo.com/?p=380 1.sysctl sysctl命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中 [root@ser ...

  4. Chapter 2 - How to Add a sprite

    Chapter 2 - How to Add a sprite 1. Add image resources 1.1add resources on win32 2. Add a sprite TIP ...

  5. jquery插件select2事件不起作用(select2-3.5.4)

    jquery插件select2事件不起作用 >>>>>>>>>>>>>>>>>>>&g ...

  6. html通用导航条制作

    第一步:先创建一个盒子,定义类为 nav,width 1000,height 40px,防京东的导航,与浏览器顶部100px,margin-top:100px,看的更直观 第二步:使用无序列表放置,导 ...

  7. [上传下载] C#FileUp文件上传类 (转载)

    点击下载 FileUp.zip 主要功能如下 .把上传的文件转换为字节数组 .流转化为字节数组 .上传文件根据FileUpload控件上传 .把Byte流上传到指定目录并保存为文件 看下面代码吧 // ...

  8. [PDF] PDFOperation--C#PDF文件操作帮助类 (转载)

    点击下载 PDFOperation.rar 这个类是关于PDFOperation的帮助类,主要是实现C#PDF的文件操作,具体实现功能如下1.构造函数2.私有字段3.设置字体4.设置页面大小5.实例化 ...

  9. java.sql.Date to java.util.Date

    发这篇博文的题目可能无法直接表示内容,但是确实是java.sql.Date和java.util.Date. 今天在使用'net.sf.json.JSONObject'封装json数据的时候,碰到很奇怪 ...

  10. Visual 2012 常用快捷键

    快捷键 功能说明 Crtl+K,Crtl+C 注释光标所在行,或选中行 Crtl+K,Crtl+U 反注释光标所在行,或选中行 Crtl+K,Crtl+F 格式化全文 F12 转到定义 Shift + ...