SQL Server[SL] Silverlight + WCF Demo项目

I:项目描述:利用 Silverlight+WCF
技术,模拟资源管理器(如图1)效能,通过地方栏输入本地文件夹路径,然后拿分析出的拖欠目录下有所文件(夹)存储到数据库被,然后又加载到界面及显得出;
SQL Server 1

(图1)

II:涉及技术:Silverlight + WCF + Component One 控件(TreeView 和
FlexGrid)
III:开发环境:Visual Studio2012 + SQL Server 2008 R2 + Silverlight 5 +
Component One C1Silverlight_2014v1;

一  种架构(如图2)

SQL Server 2(图2)

FolderDB:DAL(数据访问层),包括文件属性类 Folders,文件夹树模型类
FolderModel,数据库操作类 DBHelper;

FolderUI:Silverlight 客户端,基本界面彰显,包括 FlexGrid 标题数据源类
ColumnHeaders,文件大小值转换类 FileSizeConverter;

FolderWCF:WCF 服务层,包括 FolderService 服务类;

FolderWeb:Web层,该型遭到干不多;

次  源码部分分析

SQL Server 3SQL Server 4

  1 /// <summary>
  2 /// 执行多条SQL语句,实现数据库事务
  3 /// </summary>
  4 /// 多条SQL语句
  5 public int ExecuteSqlTran(List sqlStrList)
  6 {
  7     SqlTransaction sqlTran = null;
  8     try
  9     {
 10         if (ConnectionState.Open != m_SqlConn.State)
 11         {
 12             m_SqlConn.Open();
 13         }
 14         int count = 0;// 影响的记录数
 15         SqlCommand cmd = new SqlCommand();
 16         sqlTran = m_SqlConn.BeginTransaction();
 17         cmd.Connection = m_SqlConn;
 18         cmd.Transaction = sqlTran;
 19         foreach (string sqlStr in sqlStrList)
 20         {
 21             if (sqlStr.Trim().Length > 1)
 22             {
 23                 cmd.CommandText = sqlStr;
 24                 count += cmd.ExecuteNonQuery();
 25             }
 26         }
 27         sqlTran.Commit();// 提交数据库事务
 28         return count;
 29     }
 30     catch (SqlException sqlEx)
 31     {
 32         if (null != sqlTran)
 33         {
 34             sqlTran.Rollback();// 失败后回滚
 35         }
 36 
 37         throw new Exception(sqlEx.Message);
 38     }
 39 }

顾执行完 ExecuteNonQuery()后,并无算是寿终正寝,事务在终极还得进行付出数据库事务才行,sqlTran.Commit(),否则操作一直还无碰面执行,可是调试过程被也未会晤现身非凡;

SQL Server 5SQL Server 6

  1 public class FolderModel
  2 {
  3     /// <summary>
  4     /// 当前目录(文件夹)属性
  5     /// </summary>
  6     public Folders CurrFolder { get; set; }
  7 
  8     /// <summary>
  9     /// 子文件(夹)集合
 10     /// </summary>
 11     public ObservableCollection SubFolders { get; set; }
 12 
 13     public FolderModel()
 14     {
 15         SubFolders = new ObservableCollection();
 16     }
 17 
 18     public FolderModel(Folders folders)
 19     {
 20         CurrFolder = folders;
 21         SubFolders = new ObservableCollection();
 22     }
 23 }

顿时是绑定 C1TreeView 控件的数据源模型,其中 ObservableCollection
是代表一个动态数据集合,在添加项、移除项或刷新整个列表时,此聚众将提供通知。SubFolders
则是作为子树的绑定,CurrFolder 则是当当下节点的绑定,详细显示底的 XAML
代码解释;

SQL Server 7SQL Server 8

  1 /// <summary>
  2 /// Header数据源
  3 /// </summary>
  4 public class ColumnHeader : INotifyPropertyChanged
  5 {
  6     private List m_HeaderList;
  7     public event PropertyChangedEventHandler PropertyChanged;
  8     public List HeaderList
  9     {
 10         get
 11         {
 12             return m_HeaderList;
 13         }
 14         set
 15         {
 16             m_HeaderList = value;
 17             if (PropertyChanged != null)
 18             {
 19                 PropertyChanged.Invoke(this, new PropertyChangedEventArgs("HeaderList"));
 20             }
 21         }
 22     }
 23 }

此类作为 C1FlexGrid 列标题就 Column.Header 的动态绑定数据源,HeaderList
中储存的凡每列的列名;该数据会从 WCF
服务端获取,然后绑定以客户端上显得;

SQL Server 9SQL Server 10

  1 public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
  2 {
  3     try
  4     {
  5         int byteSize = int.Parse(value.ToString());// 单位字节
  6         int nKBSize = (int)Math.Ceiling(byteSize * 1.0 / 1024);// 转换成KB
  7 
  8         return string.Format("{0} KB", nKBSize);
  9     }
 10     catch (Exception ex)
 11     {
 12         throw new Exception(ex.Message);
 13     }
 14 }

因为倘若以文件大小该列的价周由字节转换成为 KB,则拿 Size
那一列绑定该转换器即可;

  • ItemsSource=”{Binding SubFolders}” // 绑定 SubFolders
    数据源,该数据源在 FolderModel 类中定义,作为树数据源;
  • ItemTemplate=”{StaticResource FolderTemplate}” //
    指定树每个节点的模版定义;静态资源 FolderTemplate
    则是在<UserControl.Resources>标签中定义;
  • HierarchicalDataTemplate:// 定义 TreeView 节点模版
  • ItemsSource=”{Binding SubFolders}” // 同样指定该模版数据源
  • <TextBlock Text=”{Binding CurrFolder.Name}” /> //
    节点所涵盖的内容,绑定 CurrFolder 对象吃 Name 属性值,在 FolderModel
    类中定义;

C1FlexGrid控件:
AutoGenerateColumns=”False”
//绑定数据源中多少列数据并无思展示出,只要求有指定的排展现,则用安装成
false,阻止其自动生成列;

<c1:C1FlexGrid.Columns> // 设置每列所绑定的数码

SQL Server 11SQL Server 12

  1 <c1:Column Binding="{Binding [2]}" HorizontalAlignment="Left" Width="200">
  2     <c1:Column.HeaderTemplate>
  3         <DataTemplate>
  4             <TextBlock Text="{Binding Path=HeaderList[2]}" />
  5         </DataTemplate>
  6     </c1:Column.HeaderTemplate>
  7 </c1:Column>

该培训绑定的多寡源类型为 List<List<string>>,所以 Binding
的靶子就是是 List<string> 类型,而论往之思绪,Binding 的目的是具备
get,set 的特性,查看了 List 类下起 public T this[int index] { get;
set; },所以可以一贯通过 [n] 索引来绑定数据;

HeaderTemplate 作为 Header 的沙盘定义,绑定的数目源类型是
ColumnHeader,直接看该性质 HeaderList 即可;

 

充分文书夹树节点单击事件,在 FlexGrid 中加载该文件夹下有所文件音讯;

SQL Server 13SQL Server 14

  1 // 文件夹目录上的选择单个文件夹事件
  2 private void FoldersTree_SelectionChanged(object sender, SelectionChangedEventArgs e)
  3 {
  4     C1TreeViewItem selectedNode = tvFoldersTree.SelectedItem;
  5     if (null != selectedNode)
  6     {
  7         // 当前选择的节点
  8         FolderModel selectedFolderModel = (FolderModel)selectedNode.Header;
  9         m_SelectedFolderName = selectedFolderModel.CurrFolder.Name;// 节点名称(文件夹名)
 10         m_WCFClient.GetFilesAsync(selectedFolderModel.CurrFolder.ID);
 11     }
 12 }
 13 
 14 void GetFilesCompleted(object sender, GetFilesCompletedEventArgs e)
 15 {
 16     if (null == e.Error)
 17     {
 18         List<List<string>> result = e.Result;
 19         ColumnHeader columnHeader = new ColumnHeader();
 20         columnHeader.HeaderList = result[0];
 21         fgFilesView.ColumnHeaders.DataContext = columnHeader;// 绑定列标题数据源
 22 
 23         result.RemoveAt(0);// 移除第一个表示列名称的List
 24         fgFilesView.ItemsSource = new PagedCollectionView(result);// 绑定列内容数据源
 25         fgFilesView.Columns[3].ValueConverter = new FileSizeConverter();
 26         txtMsg.Text = "加载文件夹【" + m_SelectedFolderName + "】目录下的文件已完成。";
 27     }
 28     else
 29     {
 30         txtMsg.Text = "加载文件数据失败,异常信息:" + e.Error.Message;
 31     }
 32 }

    C1TreeView 的节点是 C1TreeViewItem
类型,所以取得当前点击的节点可以据此:C1TreeViewItem selectedNode =
tvFoldersTree.SelectedItem;  当然为堪由 sender
转型取得;值得注意的是,在此,C1TreeViewItem 的 Header 属性是
C1TreeView 所绑定数据源的项目,即 FolderModel,而于 xaml 文件被,对
Column 标签的 header 属性进行价值绑定时,其 header 值为 string
类型!!故在 xaml 中针对 header 的绑定是经 HeaderTemplate
模版定义来好的;

    服务器端重返的 e.Result 是一个 List<List<string>>
类型,其中第一单 List<string>
指的凡列名;列名的绑定模式:fgFilesView.ColumnHeaders.DataContext =
columnHeader;  C1FlexGrid 之绑定格局:fgFilesView.ItemsSource = new
PagedCollectionView(result);  其中 DataContext 和 ItemsSource
二种植是暴发分之,本人还不曾上到,读者可翻阅外人之系博医学习;

   
对第三列的文件大小需要绑定值转换器:fgFilesView.Columns[3].ValueConverter
= new FileSizeConverter(); 即可;

SQL Server 15SQL Server 16

  1 <configuration>
  2   <system.serviceModel>
  3     <bindings>
  4       <basicHttpBinding>
  5         <binding name="BasicHttpBinding_IFolderService" maxBufferSize="2147483647"
  6           maxReceivedMessageSize="2147483647">
  7           <security mode="None" />
  8         </binding>
  9       </basicHttpBinding>
 10     </bindings>
 11     <client>
 12       <endpoint address="http://localhost:54416/FolderService.svc"
 13         binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IFolderService"
 14         contract="FolderServiceRefer.IFolderService" name="BasicHttpBinding_IFolderService" />
 15     </client>
 16   </system.serviceModel>
 17 </configuration>

ServiceReferences.ClientConfig

    该公文是由 Silverlight 客户端添加服务引用时自动生成的布置文件,其中
<bindings> 标签内容是由 WCF 服务器端的 Web.config 配置文件被对应之
<bindings> 标签内容截取部分要来,对于 maxBufferSize 和
maxReceivedMessageSize 个别独属性最好设置值老组成部分,而且得值一样,不可知超越 2147483647;否则会报如下非凡:

    1:“由于正在缓冲新闻,马克斯ReceivedMessageSize 和 马克斯(Max)BufferSize
的价必须一律”;

    2:发生了 System.ServiceModel.ProtocolException

       
Message=已逾传入信息(65536)的顶可怜信大小配额。若一旦多配额,请用相应绑定元素上之马克斯ReceivedMessageSize属性。

         Source=System.ServiceModel

         StackTrace:

            
在System.ServiceModel.Channels.HttpInput.ThrowHttpProtocolException(String
messagem, HttpStatusCode statusCode, String statusDescription)

    <endpoint> 是客户端终结点设置,address 属性指 WCF
所在劳务器端的顾路径,其他性能内容呢是打劳动器端 Web.config
配置文件中自动生成过来的;

其三  项目境遇的题材及参考解决方法

1:WCF 的独门调试

参考解决智:将 WCF 项目“设为启动项目”,并拿 svc
文件“设为自始页”,然后以“F5”即可打开“WCF测试客户端”,如下图,然后拔取假设调剂的方(如SaveFolders()),在右侧的“值”中填入所需要参数(字符串里待转义),再实践“调用”即可在“响应”中见到结果值;假使在
VS 中相应的艺术吃投入断点,则好展开断点调试操作!

SQL Server 17

2:WCF 测试客户端的部署文件

参考解决形式:上图中,在“配置文件”上右键采用“用 SvcConfigEditor
进行编制”选项,即可对 WCF 测试客户端的安排文件举办改动;

更是是出新“已超越传入音信(65536)的无限老信大小配额。”的怪音信时,需要修改中“绑定”目录下就定义之
basicHttpBinding 属性配置新闻,将内部的 马克斯(Max)BufferPoolSize 和
马克斯BufferSize 和 马克斯(Max)ReceivedMessageSize 的价均改呢 int 的 马克斯Value
即可;

还有,每一次打开该
SvcConfigEditor,程序都会师自动重新加载“个人文件夹\AppData\Local\Temp\Test
Client Projects\11.0\f868aff1-aa2d-4418-abaf-f4be03a71529”下之
Client.dll.config 配置文件,f868aff1-aa2d-4418-abaf-f4be03a71529
这多少个依据事态会具备改观,那样此前的性配置修改就空了,每一回启动都使改,那外孙女的定不涉及了呀,在
WCF
测试客户端里,在“工具”-》“选项”中,把“始终当启动服务时更转配置”选项去丢就欧克了!

SQL Server 18

3:没有非常,重新生成解决方案吗还事业有成,然则启动 Silverlight
后界面及了空白

参照解决办法:毫无头绪的 bug 呀,而且是深藏不露的!通过启动 Web
端的界面也无从呈现 Silverlight 程序,而且查看了 Silverlight 中 xaml
文件下呢随便非常意况,此时此刻,可以毫无疑问之是加载 Silverlight
过程被出错了,没有正常加载Silverlight!可是又哪晓得是呀
bug,哪个位置出现了 bug 呢?

当 Web 项目面临找到要加载 Silverlight 应用程序的 aspx 页面文件,将
onSilverlightError 该函数内之 errMsg 错误音信弹有展现即可;

SQL Server 19

这儿还因错误指示去探寻度娘就简单多了,2103之不当解决如下:

出于在修改 Silverlight
客户端的命名空间时,导致项目内从不根本了的改了命名空间,才碰面招2103左;在
Silverlight
项目右键属性被,查看“启动对象”是否是修改命名空间后的取舍即可;

SQL Server 20

 

4:在 Silverlight 客户端添加服务引用时,分外“找不顶路
Project.Web.Service,它以 瑟维斯(Service)Host 指令中提供吗 瑟维斯(Service)特性值,或在布置元素…”

SQL Server 21

使,我说的凡若是,你曾经全确定你的 WCF 服务完全正确,Web.config
配置里吗完全正确,这这一个错误就可能是为您以 WCF
项目中编了服务之后,没有针对性 WCF
项目“重新转”导致的!!这为提示在大家,在档次编码过程遭到,每一次对 WCF
项目举行编辑修改后,都要又生成转,并且以 Silverlight
客户端的劳务达标右键“更新服务引用”才行,不然你改变了一半龙的 WCF
服务端方法,结果实施之结果仍然仍旧为人口心寒,这就是真正寒心了… …

5:项目之安排问题

VS 默认是拔取自带的 IIS Express 来部署 Silverlight 项目与 WCF
服务,部署后当右侧下比赛会合世如下图标与情节;

SQL Server 22

至于 IIS Express 和地面的 IIS
的区分,是一个相当风趣的话题,这里虽不说了,提出去看大神博客解析,会获益匪浅的。这里大概提及一些中坚的关于
IIS Express 知识:

部署文件:C:\Program Files\IIS
Express\AppServer\applicationhost.config

<applicationPools> 标签    —-    应用程序池配置

    <add name=”Clr4IntegratedAppPool” managedRuntimeVersion=”v4.0″
managedPipelineMode=”Integrated”
CLRConfigFile=”%IIS_BIN%\config\templates\PersonalWebServer\aspnet.config”
autoStart=”true” />

    相当于 IIS 中

    SQL Server 23

<sites> 标签    —-    网站配置,每一个 <site>
子标签,代表一个网站的安排

SQL Server 24SQL Server 25

  1 <site name="Development Web Site" id="1" serverAutoStart="true">
  2     <application path="/">
  3         <virtualDirectory path="/" physicalPath="%IIS_BIN%\AppServer\empty_wwwroot" />
  4     </application>
  5     <bindings>
  6         <binding protocol="http" bindingInformation=":8080:localhost" />
  7     </bindings>
  8 </site>

<defaultDocument> 标签    —-    设置默认开首页

SQL Server 26SQL Server 27

  1 <files>
  2     <add value="Default.htm" />
  3     <add value="Default.asp" />
  4     <add value="index.htm" />
  5     <add value="index.html" />
  6     <add value="iisstart.htm" />
  7     <add value="default.aspx" />
  8 </files>

另的可以活动了然去了!

 

Silverlight+WCF 部署在地面 IIS 上,需要注意事项:

1)WCF 项目及 SilverlightWeb 项目揭发暨 IIS 网站下之同目录下,

SQL Server 28

2:作为第二差发表的项目,不克选“发布前去除所有现有文件”,否则会将前面一个通告的文本清除了;

SQL Server 29
3:公布目录下的布文件 Web.config
检查一下是免是WCF项目蒙之部署文件,即便不是,手动粘贴过来覆盖

4:修改 ClientBin\*.xap\ServiceReferences.ClientConfigSQL Server,文本中,关于WCF服务地点的终结点配置,改吗地点 ip 地址;

SQL Server 30

5:应用程序“DEFAULT WEB SITE”中的服务器错误;HTTP 错误
403.14-Forbidden;Web服务器被布置也无列有是目录的情。

因安排之连串中从不默认的开行页面,IIS
设置的默认启动页面文档包括【“Default.htm”,“Default.asp”,“index.htm”,“index.html”,“iisstart.htm”,default.aspx】,而若安排之品种根本目录下没那个文档中之起码一个,而且,在
IIS
效用视图中的“目录浏览”设置里吧熬用了,所以报这几个错误!解决智好失去搞定吧!!

SQL Server 31

SQL Server 32

6:直接看 svc
服务文件(http://192.168.0.64/FolderService.svc)报如下异常:

手上都禁用此服务的正负数据公布。

如前以 VS
上调节一切正常,只是宣布后出现这一个题目,去宣布目录下查看配置文件
Web.config,看是不是是 WCF 项目下之很配置文件,不是的语句就手动拷贝覆盖。

否则的语就照浏览器上边出现的生提醒解决:

SQL Server 33

相关文章