在WCF中一起使用JSON和gzip

时间:2019-02-10 07:19:41

标签: c# json wcf gzip

我需要在服务器端(WCF)上创建一个端点,该端点将接受来自客户端的包含标头的请求:

Content-Type : application/json
Content-Encoding : gzip
Accept-Encoding : gzip

在不实现自定义MessageEncodingBindingElement的情况下是否可以完成? 像这样:

 <customBinding>
     <binding name="gzipbinding">
        <binaryMessageEncoding compressionFormat="GZip"/>
        <webMessageEncoding />
        <httpTransport/>
     </binding>
  </customBinding>

但是它会引发异常,因为绑定堆栈只能包含一个encodingBindingElement。

1 个答案:

答案 0 :(得分:0)

是的,自定义绑定中仅允许一个编码绑定元素。我认为,我们可以通过以下方法实现您想要的。 首先,定义包括BinaryMessageEncoding的自定义绑定,并将compressionformat设置为Gzip。

const data = {"0":["AAPL",0.378571,"2012-09-30"],"1":["AAPL",0.378571,"2012-12-31"],"2":["AAPL",0.378571,"2013-03-31"],"3":["AAPL",0.435714,"2013-09-30"],"4":["AAPL",0.435714,"2013-12-31"],"5":["AAPL",0.47,"2014-09-30"],"6":["AAPL",0.47,"2014-12-31"],"7":["AAPL",0.52,"2015-06-30"],"8":["AAPL",0.52,"2015-09-30"],"9":["AAPL",0.52,"2015-12-31"]};

const dividends = Object.assign({}, Object.values(data)
                    .filter(([,,d], i, _, a = new Date(d)) => 
                      !_.some(([,,e], i, _, b = new Date(e)) =>
                        b.getFullYear() === a.getFullYear()
                        && b.getMonth() > a.getMonth() 
                        && b.getDate() >= a.getDate()
                        )
                    ));
          
console.log(dividends);

然后,使用JSON字符串作为要传递的参数。

<binaryMessageEncoding compressionFormat="GZip">

然后客户端通过反序列化参数来获取值。

JsonConvert.SerializeObject(person);

必须注意的是,在某些特定情况下,我们应避免json序列化,因为使用json序列化和反序列化对象需要时间和资源(cpu,RAM)。