需求:

        要用WCF生成 Restful风格的接口,返回 JOSN格式:

{
"AInfo": {
"Code": "",
"Description": ""
},
"BInfo": {
"Code": "",
"Description": ""
},
"CInfo": {
"UserGuid": "userguid",
"UserName": "username",
"DanWeiGuid": "danweiguid",
"DanWeiName": "danweiname"
}
}

 过程:

1.使用 WCF的 webHttp  绑定。

2.为了增加程序编码的灵活性,使用了有弱类型特性的 Dictionary<string,object>来作为json字符串对应的类。

new Dictionary<string,object>
{
{"AInfo", new Dictionary<string,string>
{
{"Code",""},
{"Description",""}
}
},
{"BInfo", new Dictionary<string,string>
{
{"Code",""},
{"Description",""}
}
},
{"CInfo", new Dictionary<string,string>
{
{"UserGuid","UserGuid"},
{"UserName","UserName"},
{"DanWeiGuid","DanWeiGuid"},
{"DanWeiName","DanWeiName"}
}
}
}

3.WCF 默认的序列化不支持 Dictionary 。

4.修改WCF 传入参数与返回参数的格式。支持 string 传入,string返回。

具体实现:

webconfig 配置,增加extensions,指向修改后的  JsonBehaviorExtension

<extensions>
                 <behaviorExtensions>
                 <add name="JsonBehavior" type="JsonBehavior.Json.JsonBehaviorExtension,JsonBehavior"/>
                </behaviorExtensions>
          </extensions>

 public class JsonBehaviorExtension : BehaviorExtensionElement
{
public override Type BehaviorType
{
get { return typeof(JsonBehavior); }
} protected override object CreateBehavior()
{
return new JsonBehavior();
}
}

这是我们选择序列化工具的一个入口。接下来可以使用我们自己写的 JsonBehavior。 public class JsonBehavior : WebHttpBehavior{}

在这里我们要重写 GetRequestDispatchFormatter,GetReplyDispatchFormatter。转到自己的 JsonDispatchFormatter, 在这个类里面就有了我们需要DeserializeRequest,和  SerializeReply。我们增加一个逻辑,如果是 typeof(string) 那就不作处理。

传入参数    if (operation.Messages[0].Body.Parts[0].Type == typeof(string))
                {
                    parameters[0] = Encoding.UTF8.GetString(rawBody);
                }

返回参数    if (operation.Messages[1].Body.ReturnValue.Type == typeof(string))
               {
                  body = Encoding.UTF8.GetBytes((string)result);
               }

这样就可以了。   input  string   →   output string 。 序列化的过程开放出来了,可以选择适合自己的序列化工具了。

完整代码: https://github.com/qianch/JsonWCF

         

修改WCF的默认序列化格式的更多相关文章

  1. 修改oracle数据库默认时间格式

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ccchencheng.blog.51cto.com/2419062/929695 ...

  2. 修改easyui datebox默认日期格式

    问题描述: 根据jquery easyui datebox demo中给的示例,导入和使用datebox, 发现日期格式为: 6/22/2011, 其他的今天和关闭也是 Today, Close, 对 ...

  3. EasyUI修改DateBox和DateTimeBox的默认日期格式

      最近整理Easyui控件的时候,对Easyui的DateBox控件和DateTimeBox控件进行了梳理,而我之所以将EasyUI的DateBox控件和DateTimeBox控件放在一起,归为一类 ...

  4. hive中修改序列化格式分隔符

    标签: hadoophivealtertable 2014-11-19 10:45 4219人阅读 评论(0) 收藏 举报  分类: hadoop(6)  版权声明:本文为博主原创文章,未经博主允许不 ...

  5. [原创] Delphi 修改新建窗体时候的默认字体格式

    Delphi 修改新建窗体时候的默认字体格式 操作步骤: 1.运行输入“regedit” 2.找到目录(这里默认以Delphi 7为例) HKEY_CURRENT_USER\Software\Borl ...

  6. Mac OS修改VSCode Go的默认缩进格式

    一.在VSCode中编写Go代码时,缩进是使用tab缩进,主要是由于以下两个方面. 1. Go官方提供的代码格式化工具gofmt默认是使用tab缩进,并且为8个字符宽度. 2. 并且在VSCode中, ...

  7. Qt序列化格式分析(qint,QString)(非常简单好用)

    最近项目需要进行QT开发环境下对传输对象进行序列化与反序列化处理,对基本类型的处理在使用QT默认的序列化方式还是完全手工序列化这两种方式之间有些犹疑不定,边想了解下QT默认序列化基本类型的格式,项目中 ...

  8. .net的XML对象序列化VS WCF中xml序列化问题

    整理一下 .net 对象序列化注意事项: 1. 字段:必须是 public类型 2.属性:只读或者只写的属性不被序列化,只有 可读可写并且赋值的才可以 序列化: Someclass obj = new ...

  9. Entity Framework 6 Recipes 2nd Edition(9-7)译->在WCF服务中序列化代理

    9-7. 在WCF服务中序列化代理 问题 从一个查询里返回一个动态代理对象,想要把它序列为一个POCO(Plain-Old CLR Objects)对象. 实现基于POCO实体对象, 在运行时,EF会 ...

随机推荐

  1. 记一次利用AutoMapper优化项目中数据层到业务层的数据传递过程。

    目前项目中获取到DataSet数据后用下面这种方式复制数据. List<AgreementDoc> list = new List<AgreementDoc>(); ].Row ...

  2. ASP.NET Web API 自定义 HttpParameterBinding

    背景 问题的起因是这样的.群里面一个哥们儿发现在使用 ASP.NET WebAPI 时,不能在同一个方法签名中使用多次 FromBodyAttribute 这个 Attribute .正好我也在用 W ...

  3. Vivado2015.4使用教程(一个完成工程的建立)

    双击桌面的vivado图标,(可能有点慢) 弹出主菜单界面,点击create new project 这是介绍界面,next~ 添加好工程名,和工程位置,next~ 选择rtl Project,nex ...

  4. JAVAEE——struts2_04:自定义拦截器、struts2标签、登陆功能和校验登陆拦截器的实现

    一.自定义拦截器 1.架构 2.拦截器创建 //拦截器:第一种创建方式 //拦截器生命周期:随项目的启动而创建,随项目关闭而销毁 public class MyInterceptor implemen ...

  5. HTML4,HTML5,XHTML 之间有什么区别?

    原始日期:2014-10-25 14:12 我来从HTML的历史谈谈他们3者的区别.在HTML的早期发展中,W3C成立之前,很多标准的制定都是在浏览器的开发者们互相讨论的情况下完成的,比如HTML 2 ...

  6. GitHub:多人协作下的分支处理

    GitHub上的团队协作 远程信息 git remote:查看远程库的信息 git remote -v:查看远程库的详细信息 推送分支 git push origin 要推送的分支:比如git pus ...

  7. Windows 10环境安装VIM代码补全插件YouCompleteMe

    Windows 10环境安装VIM代码补全插件YouCompleteMe 折腾一周也没搞定Windows下安装VIM代码补全插件YouCompleteMe,今天在家折腾一天总算搞定了.关键问题是在于P ...

  8. 浅谈Cordova框架的一些理解

    前言 因为工作原因,最近需要研究Cordova框架,看了其中的源码和实现方式,当场在看的时候马上能理解,但是事后再回去看相关源码时候却发现之前理解的内容又忘记了,又不得不重新开始看,所以总觉得需要记录 ...

  9. Kafka 源代码分析之FileMessageSet

    这里主要分析FileMessageSet类 这个类主要是管理log消息的内存对象和文件对象的类.源代码文件在log目录下.这个类被LogSegment类代理调用用来管理分片. 下面是完整代码.代码比较 ...

  10. ajax同步请求JS代码

    ajax同步请求JS代码 <script type="text/javascript"> var txt = document.getElementById('txt' ...