Silverlight中的数据访问
主要是实现WCF框架下,通过LINQ TO SQL,实现服务器端和客户端之间的通信
1,新建一个项目,命名为DataGrid,给网站固定服务端口号,这里以49806为例
2,添加WCF服务,命名为contacter,完成后网站目录下出现contacter.svc与Icontacter.cs文件
注:如果跨域需要添加跨域文件cilentaccesspolicy.xml,且若WCF服务URL位于http://localhost:49086/wcf/contacter.svc,则该策略文件放在localhost目录下,即http://localhost:49086/cilentaccesspolicy.xml,而不是localhost/wcf的目录下。
3,添加一个LINQ TO SQL类,并加入相关命名空间,这里设置ContextNamespace,Entity Namespace为Linq,并添加实体类
4,现在开始编写WCF的服务契约文件Icontacter.cs
public interface Icontacter { [OperationContract] List<Linq.contacter> GetContract(); }
5,在contacter.svc文件中实现方法
public class contacter : Icontacter { public List<Linq.contacter> GetContract() { Linq.DataClasses1DataContext db = new Linq.DataClasses1DataContext (); var query = from p in db.contacters select p; var list = query.ToList<Linq.contacter>(); return list; } }
之前在这里遇到一个问题:直接用using Linq;语句,然后返回语句写return query.ToList<contacter>()时,总是出现
Cannot implicitly convert type 'System.Collections.Generic.List<Linq.contacter>' to
'System.Collections.Generic.List<DataGrid.Web.contacter>' 的编译错误
最终发现是因为Linq To SQL中的实体类contacter与WCF服务的命名相同,导致编译器无法顺利的识别,教训!
6,现在需要配置一下Web.config文件,为WCF服务设置正确的参数
<system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="DataGrid.Web.contacterBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <services> <service behaviorConfiguration="DataGrid.Web.contacterBehavior" name="DataGrid.Web.contacter"> <endpoint address="" binding="basicHttpBinding" contract="DataGrid.Web.Icontacter"></endpoint> </service> </services> </system.serviceModel>
因为对WCF配置还不是很了解,需要注意各种参数的配置
7,运行一下contacter.svc,没有错误的话,可以成功的看到浏览器上contract Service的相关信息
8,在银光的客户端引用该服务,命名空间为默认的ServiceReference1,如果在服务器端对contacter.svc等相关文件进行更改时,不要忘了更新该引用
9,在Page.XAML文件中添加一个DataGrid,设置AutoGenerateColumns="True"即可
10,编写后台代码:
public Page() { InitializeComponent(); ServiceReference1.IcontacterClient proxy = new ServiceReference1.IcontacterClient(); proxy.GetContractCompleted += new EventHandler<ServiceReference1.GetContractCompletedEventArgs>(proxy_GetContractCompleted); proxy.GetContractAsync(); } void proxy_GetContractCompleted(object sender, DataGrid.ServiceReference1.GetContractCompletedEventArgs e) { this.dataGrid1.ItemsSource = e.Result; }
IcontacterClient等方法都是由WCF自动生成的,对于GetContractCompleted也可以利用Lamda表达式改写一下,代码看起来更简洁
public SilverlightControl1() { InitializeComponent(); ServiceReference1.IcontacterClient proxy = new ServiceReference1.IcontacterClient(); proxy.GetContractCompleted+=(o,e)=> { this.dataGrid1.ItemsSource=e.Result; }; proxy.GetContractAsync(); }
11,最后运行效果: