主要是实现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();
- }
- id 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,最后运行效果