zoukankan      html  css  js  c++  java
  • 修改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

             

             

             

            

             

  • 相关阅读:
    3.8快乐
    只剩一个人了
    需求分析
    再也不看皇马比赛
    最近蛮忙,没头绪
    ↗☻【响应式Web设计 HTML5和CSS3实战 #BOOK#】第5章 CSS3:选择器、字体和颜色模式
    ↗☻【高性能网站建设进阶指南 #BOOK#】第12章 尽早刷新文档的输出
    ↗☻【响应式Web设计 HTML5和CSS3实战 #BOOK#】第4章 响应设计中的HTML5
    ↗☻【JavaScript】code
    ↗☻【高性能网站建设进阶指南 #BOOK#】第11章 划分主域
  • 原文地址:https://www.cnblogs.com/EllisQian/p/6358288.html
Copyright © 2011-2022 走看看