信息系统开发平台OpenExpressApp - 配置CSLA的WCF数据门户代理

    由于CSLA数据门户支持WCF代理,所以这里我就很自然的使用了WCFProxy功能来作为分布式应用支持。在园子中有很多人对WCF如何使用都进行了细致的介绍,而且本人其实也只是了解WCF的皮毛而已,所以我这里就不作具体介绍,大家想从整体上了解如何使用WCF的可以上网去搜索一下。

  由于CSLA内置了WCF数据门户,所以在使用过程中只需要在服务器端和客户端进行配置即可,但是必须对一些参数进行配置,这也是我在过程中遇到的一些问题,由于应用中可能会传输较大数据,所以会对修改一些配置以及添加压缩数据功能。本篇主要讲解一下与OpenExpressApp相关的WCF知识。

服务器端配置

  在serviceModel中添加端口以及绑定、扩展等配置。下面配置为支持http和net.tcp协议。其中几个重要的参数需要进行一些配置,如maxReceivedMessageSizemaxArrayLengthmaxBytesPerRead  等为了支持大数据量进行了配置。

Code
 <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),在代码中启动,代码如下:

Code
        private void Start()
        {
            
this.selfHost = new ServiceHost(typeof(WcfPortal));
            //通过配置文件配置服务
            this.selfHost.Open();
      ... 
         }

 

客户端配置

  首先在appSetting中添加 CslaDataPortalProxy Key为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中一次只能指定一个。 

 

Code
    < 
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/ ]


posted on 2009-11-24 22:41  周 金根  阅读(2925)  评论(3编辑  收藏

导航