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,并添加实体类

QQ截图未命名

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,最后运行效果:

             QQ截图未命名1

posted @ 2010-05-19 16:58  ringgo  阅读(2227)  评论(4编辑  收藏  举报