信息系统开发平台OpenExpressApp - 配置CSLA的WCF数据门户代理
由于CSLA数据门户支持WCF代理,所以这里我就很自然的使用了WCFProxy功能来作为分布式应用支持。在园子中有很多人对WCF如何使用都进行了细致的介绍,而且本人其实也只是了解WCF的皮毛而已,所以我这里就不作具体介绍,大家想从整体上了解如何使用WCF的可以上网去搜索一下。
由于CSLA内置了WCF数据门户,所以在使用过程中只需要在服务器端和客户端进行配置即可,但是必须对一些参数进行配置,这也是我在过程中遇到的一些问题,由于应用中可能会传输较大数据,所以会对修改一些配置以及添加压缩数据功能。本篇主要讲解一下与OpenExpressApp相关的WCF知识。
服务器端配置
在serviceModel中添加端口以及绑定、扩展等配置。下面配置为支持http和net.tcp协议。其中几个重要的参数需要进行一些配置,如maxReceivedMessageSize、maxArrayLength、maxBytesPerRead 等为了支持大数据量进行了配置。
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<system.serviceModel>
<services>
<!-- Before deployment, you should remove the returnFaults behavior configuration to avoid disclosing information in exception messages -->
<service name="Csla.Server.Hosts.WcfPortal" behaviorConfiguration="returnFaults">
<endpoint address="http://localhost:8000/GIX4" binding ="customBinding" bindingConfiguration="compactBinding" contract="Csla.Server.Hosts.IWcfPortal"/>
<endpoint address="net.tcp://localhost:8001/GIX4" binding="netTcpBinding" bindingConfiguration="netTcp" contract="Csla.Server.Hosts.IWcfPortal">
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/GIX4"/>
</baseAddresses>
</host>
</service>
</services>
<bindings>
<customBinding>
<binding name="compactBinding" sendTimeout="00:10:00">
<compactMessageEncoding>
<binaryMessageEncoding>
<readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096"
maxNameTableCharCount="16384"/>
</binaryMessageEncoding>
</compactMessageEncoding>
<httpTransport maxReceivedMessageSize="2147483647" />
</binding>
</customBinding>
<netTcpBinding>
<binding name="netTcp" maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096"
maxNameTableCharCount="16384"/>
</binding>
</netTcpBinding>
</bindings>
<extensions>
<bindingElementExtensions>
<add name="compactMessageEncoding" type="Amib.WCF.CompactMessageEncodingElement, CompactMessageEncoder,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bindingElementExtensions>
</extensions>
</system.serviceModel>
服务器端可以宿主在IIS中和window以及服务中,现在OEA提供了一个WPF window宿主(项目名称为:OpenExpressApp.Server.WPFHost),在代码中启动,代码如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
private void Start()
{
this.selfHost = new ServiceHost(typeof(WcfPortal));
//通过配置文件配置服务
this.selfHost.Open();
...
}
客户端配置
首先在appSetting中添加 CslaDataPortalProxy Key为Csla.DataPortalClient.WcfProxy, Csla,指定使用WCF数据门户
<add key="CslaAuthentication" value="Csla" />
<add key="CslaPropertyChangedMode" value="Xaml" />
<add key="CslaDataPortalProxy" value="Csla.DataPortalClient.WcfProxy, Csla"/
</appSettings>
然后再在serviceModel中添加端口以及绑定、扩展等配置,这些都与服务器端配置对应。下面配置为支持http协议,你也可以配置为支持net.tcp协议,但好像CSLA中一次只能指定一个。
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
< serviceModel >
<!--<client>
<endpoint name="WcfDataPortal"
address="net.tcp://localhost:8001/GIX4"
binding="netTcpBinding" bindingConfiguration="netTcp"
contract="Csla.Server.Hosts.IWcfPortal"/>
</client>-->
<client>
<endpoint name="WcfDataPortal" address="http://localhost:8000/GIX4" binding="customBinding" bindingConfiguration="compactBinding" contract="Csla.Server.Hosts.IWcfPortal" />
</client>
<bindings>
<customBinding>
<binding name="compactBinding" sendTimeout="00:10:00">
<compactMessageEncoding>
<binaryMessageEncoding>
<readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096"
maxNameTableCharCount="16384" />
</binaryMessageEncoding>
</compactMessageEncoding>
<httpTransport maxReceivedMessageSize="2147483647" />
</binding>
</customBinding>
<netTcpBinding>
<binding name="netTcp" transferMode="Streamed" maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096"
maxNameTableCharCount="16384" />
</binding>
</netTcpBinding>
</bindings>
<extensions>
<bindingElementExtensions>
<add name="compactMessageEncoding" type="Amib.WCF.CompactMessageEncodingElement, CompactMessageEncoder,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bindingElementExtensions>
</extensions>
</system.serviceModel>
压缩
在没有压缩之前,通过外网访问,发现速度有点慢。于是想看看网络压缩比会有多大,我通过HTTP调试工具Fiddler查看WCF传输压缩率的,通过gZip压缩后发现可以减少20倍。于是觉得给WCF加上压缩通道。在网上搜到的两个压缩功能,用了其中一个,可以压缩大概20倍,源码在【OpenSource】目录下的CompactMessageEncoder_src.zip,参考文档在CompactMessageEncoder
更多内容: 开源信息系统开发平台之OpenExpressApp框架.pdf
欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ]