由于CSLA数据门户支持WCF代理,所以这里我就很自然的使用了WCFProxy功能来作为分布式应用支持。在园子中有很多人对WCF如何使用都进行了细致的介绍,而且本人其实也只是了解WCF的皮毛而已,所以我这里就不作具体介绍,大家想从整体上了解如何使用WCF的可以上网去搜索一下。
由于CSLA内置了WCF数据门户,所以在使用过程中只需要在服务器端和客户端进行简单配置既能够简单使用了。由于应用中可能会传输较大数据,所以会对修改一些配置以及添加压缩数据功能。本篇主要讲解一下与OpenExpressApp相关的WCF知识。
服务器端配置
在serviceModel中添加端口以及绑定、扩展等配置。下面配置为支持http和net.tcp协议。其中对一些参数进行了配置,如maxReceivedMessageSize等为了支持大数据量进行了配置。
<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>
客户端配置
首先在appSetting中添加CslaDataPortalProxyKey为Csla.DataPortalClient.WcfProxy, Csla,指定使用WCF数据门户
<appSettings>
<add key="CslaAuthentication" value="Csla" />
<add key="CslaPropertyChangedMode" value="Xaml" />
<add key="CslaDataPortalProxy" value="Csla.DataPortalClient.WcfProxy, Csla"/
</appSettings>
然后再在serviceModel中添加端口以及绑定、扩展等配置,这些都与服务器端配置对应。下面配置为支持http协议,你也可以配置为支持net.tcp协议,但好像CSLA中一次只能指定一个。
<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>