修改WCF的默认序列化格式

需求:

        要用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

         

 

 

         

 

         

        

         

posted on 2017-01-30 19:24 EllisQian 阅读(...) 评论(...) 编辑 收藏

导航

公告