修改WCF的默认序列化格式

来源:互联网 发布:域服务器软件分发 编辑:程序博客网 时间:2024/05/16 03:53

需求:

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

 

{    "AInfo": {        "Code": "1",        "Description": ""    },    "BInfo": {        "Code": "1",        "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","1"},                        {"Description",""}                    }    },    {"BInfo", new Dictionary<string,string>                    {                        {"Code","1"},                        {"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

         

 

 

         

 

         

        

         

0 0
原创粉丝点击