惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
I
InfoQ
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
Y
Y Combinator Blog
博客园_首页
Martin Fowler
Martin Fowler
宝玉的分享
宝玉的分享
A
About on SuperTechFans
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
T
The Blog of Author Tim Ferriss
C
Check Point Blog
B
Blog RSS Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Engineering at Meta
Engineering at Meta
B
Blog
爱范儿
爱范儿
Stack Overflow Blog
Stack Overflow Blog
aimingoo的专栏
aimingoo的专栏
WordPress大学
WordPress大学
F
Fortinet All Blogs
月光博客
月光博客
GbyAI
GbyAI

博客园 - discoverx

StackPanel在增加控件的问题 IE9.0与IE8.0Table中的区别整理 删除DataTable中重复的记录 去除HTML标签--2005SQL写法 WCF安全参数相关设置方法详解(转) ASP.NET SQL Server 注册工具 (Aspnet_regsql.exe) (转) http://msdn.microsoft.com/zh-cn/library/cc838145(VS.95).aspx http://www.guminzhijia.com/gmxy/rsbd/6494.html UML中符号的意义(转) jatoolsPrinter 2手册 - discoverx - 博客园 Silverlight入门教程 js魔力代码 Javascript多级菜单 Silverlight 2.0中文学习资源集萃 水晶报表基础操作技巧收藏 诡异的中毒现象 注册表里相应的 .Net 中的反射(动态创建类型实例) - Part.4动态创建对象 .Net 中的反射(查看基本类型信息) - Part.2
Silverlight客户端和WCF服务器端共享类库(转)
discoverx · 2010-08-12 · via 博客园 - discoverx

WCF为了给Silverlight客户端提供引用共享类型,我们必须定义相关DataContract和DataMember契约属性,通过这些属性来制定一个类的数据结构。Silverlight客户端可以通过添加引用和服务器端进行通讯。在实际项目中,这样的定义局限性太多,微软当前已经推出.Net RIA Services 来解决这个问题,但是,当前.Net RIA仍旧是测试版本,不能被运用于正式项目。针对这个问题,我看了相关Prism框架资料,Prism设计出一个WPF和Silverlight的共享代码方案,参考这个概念,我考虑将Silverlight项目中的数据契约独立提取出一个类,然后将该类共享与Silverlight和WCF之间。这样,我们可以在这个独立契约类中做一些复杂的功能同时供客户端和服务器端共享调用。但是,由于Silverlight客户端和服务器端有着不同的CLR,所以,不得不在创建项目的同时,删除一些相关有冲突的引用。详细步骤请看演示:

1. 首先创建一个项目,“SilverlightChina.CodeSharing”


2. 建立新的契约类项目,该类项目将保存DataContract和DataMember,首先创建一个Silverlight类项目,SilverlightChina.CodeSharing.Client,然后创建.Net类项目SilverlightChina.CodeSharing.Server,对于新创建类,本身都会有Class1.cs文件,在这次演示中不需要该文件,删除即可。


3. 统一命名一个命名空间,这样做是为了能够同步共享信息。分别进入两个新建类项目的属性页面,添加默认的命名空间, SilverlightChina.CodeSharing.

4. 建立一个类,创建契约成员,这个类文件可以在客户端创建,也可以在服务器端创建,这里我选择在SilverlightChina.CodeSharing.Client客户端创建。

我创建了一个新的类Student,该类描述学生信息。由于服务器端CLR不支持System.Windows类库,所以,我们需要删除其引用。

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SilverlightChina.CodeSharing.Entities
{
    public class Student
    {
        public string Name { get; set; }
        public string EmailAddress { get; set; }
    }
}

5. 添加一个“链接类”到SilverlightChina.CodeSharing.Server, 通过链接类进行共享契约成员。

选择"Add Link".

这样,已经共享契约类已经建立完成,下面来演示如何使用该类.

1. 首先在Web项目中,添加SilverlightChina.CodeSharing.Server引用, 然后建立WCF服务,

2. 创建一个WCF函数返回类,这里和普通的WCF访问数据库返回数据是一样的方法, 这里我们调用了SilverlightChina.CodeSharing.Server的契约成员属性。

using System;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.Collections.Generic;
using System.Text;
using SilverlightChina.CodeSharing.Entities;

namespace SilverlightChina.CodeSharing.Web
{
    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class StudentService
    {
        [OperationContract]
        public Student GetStudent()
        { 
           return new Student()
            {
             Name="Jv9",
             EmailAddress ="QQ34506@hotmail.com"
            };
        }

    }
}

3. 在Silverlight客户端使用契约成员,Student。首先要添加一个服务引用,添加的时候,点击“Advanced”检查是否选中,重复使用所有类库。

4. 在客户端添加引用。

using SilverlightChina.CodeSharing.Entities;
using SilverlightChina.CodeSharing.Services;

5. 在客户端调用WCF服务。

using System;
using System.Windows;
using System.Windows.Controls;
using SilverlightChina.CodeSharing.Entities;
using SilverlightChina.CodeSharing.Services;

namespace SilverlightChina.CodeSharing
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            ClientTest();
        }

        void ClientTest()
        {
            var client = new StudentServiceClient();
            client.GetStudentCompleted += (sender, ea) =>
                {
                    tbName.Text = ea.Result.Name;
                    tbEmail.Text = ea.Result.EmailAddress;
                };
            client.GetStudentAsync();
        }
    }
}

6. 返回结果为:


这样已经实现了共享契约成员的功能,在上面ClientTest中,可以添加任意的方法进行数据绑定。