zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    求长度的另一种方法(""+obj).Length
    XCode中如何使用事务
    最终版 Reflector v1.0 (+简单的反流程混淆)
    与ObjectDataSource共舞
    性能&分布式&NewLife.XCode对无限数据的支持
    XCode之第一次亲密接触
    5,ORM组件XCode(动手)
    你知道吗?多个类多线程环境下静态构造函数的执行顺序
    使用C#编写IDA插件 IDACSharp v1.0.2010.0605
    XCMS V1.0 Beta1 发布
  • 原文地址:https://www.cnblogs.com/626498301/p/Nick.html
Copyright © 2011-2022 走看看