需求:

        要用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. 【JAVAWEB学习笔记】网上商城实战:环境搭建和完成用户模块

    网上商城实战 今日任务 完成用户模块的功能 1.1      网上商城的实战: 1.1.1    演示网上商城的功能: 1.1.2    制作目的: 灵活运用所学知识完成商城实战. 1.1.3    ...

  2. VR全景智慧城市--2017年VR项目加盟将是一个机遇

    全景智慧城市项目是河南艺境空间文化传播有限公司自主开发的国内第一家商业全景平台, 旨在构建全景城市,实现智慧生活,让人们随时随地身临其境拥有全世界,享受快捷.真实.趣味.优质生活. 以VR虚拟现实技术 ...

  3. MySQL开放远程登录

    在服务器上部署MYSQL每次观看MYSQL记录或者修改的时候都需要登录服务器,又烦又占资源.所以使用另一种方法:对外开放接口. 注:如果某些服务器开启防火墙屏蔽了某些接口就有可能导致远程用户无法登录M ...

  4. 关于 IDEA 自动识别问题,jsp页面Controller路径自动识别的问题

    idea之所以强大,就是强大的代码提示和联想功能,写起代码来简直不要太爽.但是这几天我发现在我的jsp页面中访问controller路径的时候不会自动提示了,对于这么严谨的我肯定要找出原因啊,哈哈. ...

  5. 一天搞定CSS:表单(form)--20

    1.表单标签 2.input标签属性与取值 代码演示 <!DOCTYPE html> <html> <head> <meta charset="UT ...

  6. Dubbo有意思的特性介绍

    Duboo 不单让我们可以像使用本地服务一样的使用远程服务,还设计了很多特性来满足我们平时开发时常见的场景,省却了我们不少麻烦,真是一款有良心的框架,下面针对这些场景和解决方案来具体解释下: 1.接口 ...

  7. IntelliJ IDEA提示:Error during artifact deployment. See server log for details.

    IntelliJ IDEA-2017.1.1 tomcat-8.5.13   问题:在IntelliJ IDEA中使用tomcat部署web app时,提示:Error during artifact ...

  8. jQuery之stop()

    开启第一篇原创博客,内容朴实,但绝对属实. 先来看看w3c的定义和语法: 定义:stop() 方法停止当前正在运行的动画. 语法:$(selector).stop(stopAll,goToEnd) 参 ...

  9. 精通JavaScipt第二版笔记——特性、函数和对象

    前言:感觉这本书只有第二章 第三章有点看头 基本类型和引用类型 基本类型:字符串 数字 布尔值 null(待确定) undifined 引用类型:对象 数组 引用传递 保存的只是对象的地址 var o ...

  10. 集成python双版本详解

    最近要准备学习Python,由于版本上的差异,不知道要学哪个,现在好多东西都是基于python2基础的,但是python2在2020年左右就可能停止了,所以干脆决定两个都装上吧!   首先上官网上下载 ...