ASP.NET WEB API回发到客户端消息体的格式化
首先基于SOA的消息通信基本都是按照一个统一的协议规范进行交互,那么必须定义消息体。不同的交互结构设计了不同的消息体。
业界统一使用的SOAP是一种规范的XML消息内容。例如在WCF中返回的结果。
随着移动互联网的盛行,Rest交互的方式越来越受青睐。
微软的MVC3之后的版本,合并了Rest WCF,越来越强大。也就是现在ASP.NET web API.
基本用法就不提了,这里主要解说的是自定义消息体的实现:
1:消息体结构:
[DataContract]
public class SendToClientMsgConteiner
{
/// <summary>
/// 结果状态
/// </summary>
[DataMember(Name = "_s")]
public MessageStatus Status { get; set; } private string _Message = "";
/// <summary>
/// 消息
/// </summary>
[DataMember(Name = "_m")]
public string Message
{
get { return _Message; }
set { _Message = value; }
} /// <summary>
/// 当前请求结果集
/// </summary>
[DataMember(Name = "_d")]
public IEnumerable<IBusinessObject> Results { get; set; } }
public enum MessageStatus
{
/// <summary>
/// 失败
/// </summary>
Error = 0,
/// <summary>
/// 成功
/// </summary>
Success = 1
} 注意,这里涉及到.net 底层的对象序列化,如果需要自定义字段内容,可以使用此属性 DataContract ,屏蔽的话 可以使用JsonIgnore 。
2 控制器中的Action 在执行完毕后 返回此对象,即可自动将对象进行序列化为Json数据
[HttpPost]
[MessageFormator]
public SendToClientMsgConteiner CalcReceiveClientProductPrice(ViewModelForCalcProductPriceClient clientData)
{
SendToClientMsgConteiner msg = new SendToClientMsgConteiner(); try
{
var priceItems = bll_ProductService.CalcReceiveClientProductPrice(clientData);
msg.Status = MessageStatus.Success;
msg.Results = new List<ViewModelForCalcProductPriceServer> { priceItems };
}
catch (Exception ex)
{
msg.Status = MessageStatus.Error;
msg.Message = ex.ToString();
} return msg;
} 3 如果需要对返回的内容进行过滤或者其它操作;那么可以为这个Action添加Filter
/// <summary>
/// 消息执行/返回的时候 拦截器
/// </summary>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MessageFormatorAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext filterContext)
{
base.OnActionExecuting(filterContext);
} public override void OnActionExecuted(HttpActionExecutedContext filterContext)
{
var result = filterContext.Response.Content as ObjectContent<SendToClientMsgConteiner>; if (null==result)
{
//不是自定义的SOAP消息 那么返回系统处理消息内容
base.OnActionExecuted(filterContext);
return;
} var msg = result.Value as SendToClientMsgConteiner;
if (msg.Status== MessageStatus.Success)
{
//成功返回 没有错误消息 那么不需要消息体属性
var content = new SendToClientMsgConteinerWithNoError
{
Status = MessageStatus.Success,
Results = msg.Results
}; filterContext.Response.Content = new ObjectContent<SendToClientMsgConteinerWithNoError>(content, result.Formatter);
} //最后调用SDK 进行消息内容处理回发
base.OnActionExecuted(filterContext);
}
} 以上方式就可以随意的进行自定义的消息内容操作订制了。
ASP.NET WEB API回发到客户端消息体的格式化的更多相关文章
- ASP.NET Web API 安全筛选器
原文:https://msdn.microsoft.com/zh-cn/magazine/dn781361.aspx 身份验证和授权是应用程序安全的基础.身份验证通过验证提供的凭据来确定用户身份,而授 ...
- Asp.Net Web API 2第六课——Web API路由和动作选择
Asp.Net Web API 导航 Asp.Net Web API第一课——入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web AP ...
- Asp.Net Web API 2第五课——Web API路由
Asp.Net Web API 导航 Asp.Net Web API第一课——入门 http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web ...
- 【ASP.NET Web API教程】3.4 HttpClient消息处理器
原文:[ASP.NET Web API教程]3.4 HttpClient消息处理器 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. 3.4 ...
- ASP.NET Web API 控制器创建过程(一)
ASP.NET Web API 控制器创建过程(一) 前言 在前面对管道.路由有了基础的了解过后,本篇将带大家一起学习一下在ASP.NET Web API中控制器的创建过程,这过程分为几个部分下面的内 ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【九】——API变了,客户端怎么办?
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 一旦我们将API发布之后,消费者就会开始使用并和其他的一些数据混在一起.然而,当新的需求出现 ...
- ASP.NET Web Api 服务器端变了,客户端该如何修改请求(转载)
转载地址:http://www.cnblogs.com/fzrain/p/3558765.html 前言 一旦我们将API发布之后,消费者就会开始使用并和其他的一些数据混在一起.然而,当新的需求出现时 ...
- 【ASP.NET Web API教程】3.2 通过.NET客户端调用Web API(C#)
原文:[ASP.NET Web API教程]3.2 通过.NET客户端调用Web API(C#) 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的 ...
- 【ASP.NET Web API教程】3 Web API客户端
原文:[ASP.NET Web API教程]3 Web API客户端 Chapter 3: Web API Clients 第3章 Web API客户端 本文引自:http://www.asp.net ...
随机推荐
- HDOJ 1397 Goldbach's Conjecture(快速筛选素数法)
Problem Description Goldbach's Conjecture: For any even number n greater than or equal to 4, there e ...
- gcc编译时头文件库文件搜索顺序(转)
原文: http://blog.csdn.net/silentfly1987/article/details/6119195
- 浏览器开发 IE webkit chrome浏览器定制
FAQ:制作自己的浏览器有何意义?1.浏览器按照您的需求命名,可自定义LOGO,对您的产品或者公司都有推广作用.2.在帮助一栏的主页以及软件安装的网页链接都可以设为您网站的链接. 3.可将首页设置为您 ...
- Java虚拟机内存优化实践
前面一篇文章介绍了Java虚拟机的体系结构和内存模型,既然提到内存,就不得不说到内存泄露.众所周知,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题就是内存泄露难以解决,尽管Java ...
- Java中的克隆(CLONE)
解读克隆 编程过程中我们常常遇到如下情况: 假设有一个对象object,在某处又需要一个跟object一样的实例object2,强调的是object和object2是两个独立的实例,只是在 开始的时候 ...
- Thinkphp中distinct的用法
Thinkphp中distincat的用法 TP中distinct()的用处主要是去除重复的值 在Thinkphp手册中也详细说明了(链接:http://document.thinkphp.cn/ma ...
- zabbix流量汇聚
"服务器流量汇总"领导提需求,要把几个数据中心的数据汇总起来,于是就google了一下"zabbix流量汇总" 按照其中一篇博客做了出来,博客地址如下. htt ...
- java反射--注解的定义与运用以及权限拦截
自定义注解类编写的一些规则: 1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是 ...
- android怎样写一个循环文字滚动的TextView
效果图: 在layout中这样来声明: <com.kaixin001.view.ScrollText android:id="@+id/news_statustxt" and ...
- Zend Framework学习日记(2)--HelloWorld篇(转)
Zend Framework学习日记(2)--HelloWorld篇 这一篇主要演示如何用zf命令行工具建立一个基于Zend Framework框架的工程,也是我初学Zend Framework的小练 ...