那天有个小孩教我WCF[一][1/3]

既然是小孩系列,当然要有一点基础才能快速掌握,归纳,总结的一个系列,哈哈

前言:

第一篇嘛,不细讲,步步教你创建一个简单SOA案例,对WCF有个基本的认识,我不会细讲概念

1.1 SOA简介

     SOA(Service-Oriented Architecture,面向服务架构),既是一种编程模式,也是软件开发的一种架构方法。

根据这种架构方法,应用程序就会由“具有一定行为(服务)的功能”单元组成的。<如果你写过WebService,你就会更好理解了,如果你以前用三层形式写,那么原来的数据访问层,你只能供你本程序中的程序调用,假如你用了这种架构,例如,根据一个ISBN查询到对应书的价格,本来是一个方法,如果你用这个架构,这个方法(行为)就会变成一种服务,这个服务绑定到一个url地址上,然后你根据这个url加个特殊的参数(例如ISBN)就可以返回一个json或者xml,然后你就可以调用了,那么例如你的andriod平板,ipad,只要可以通过url就可以获得你想要的数据,就可以达到跨平台的效果,跟WebService很像,但是WCF完全不会是那么简单的>

1.2 基本开始

前言:

我们准备完成一个简单的新闻发布系统

内部编辑发布新闻有更多的功能,但是外部我只提供查看功能,添加自己的新的新闻,但是新闻类型是 好友提供

可能由于我们的新闻系统比较好,我们提供一些接口,让别人自己做自己的客户端,也能实现发布新闻,但是我们的源代码不可能给人家的,所以我们就可以用WCF去做了,再比如,我们想做个iphone应用,别人下载我们的应用也可以查看我们发布的新闻,我们不可能在苹果手机上去访问数据库,我们通过服务去更新数据,中间可以利用WCF实现跨平台,现在我们开始做吧

Contract是契约的意思,最常见的,务必背诵

1.打开Visual Studio 2010,新建一个空白的解决方案

命名NewsSystem,点击确定

然后右击解决方案,添加4个解决方案文件夹

Clients,Hosts,Services,Interfaces

2.右击Interfaces,添加2个类库

NewsInterface

NewsExternalInterface

添加WCF中最重要的两个程序集引用

同样的操作对NewsExternalInterface类库也操作下

3. 删除默认添加的两个Class1.cs文件,分别对应向两个类库添加INewsInterface,INewsExternalInterface

4.向两个接口,都添加下面命名空间引用

using System.Runtime.Serialization;
using System.ServiceModel;

5.interface前面加上 public关键字

例如:

6.实体类,我们就不分开写了,直接写在对应的接口里面吧,这里只是演示WCF的使用,数据库操作,直接使用linq to sql了,企业里大部分用EF code first,关于这个以后有时间再讲。为了不与数据库的表明冲突,后面加一个Dto了

主要提前领略一下 操作契约,数据契约,枚举的使用

我们先操作NewsInterface类库

6.1新建一个枚举,NewsTypeEnum,演示枚举的基本写法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
 
namespace NewsInterface
{
    [DataContract]
    public enum NewsTypeEnum
    {
        [EnumMember]
        Sports,
        [EnumMember]
        IT,
        [EnumMember]
        Country,
        [EnumMember]
        Funny
    }
}

NewsTypeEnum是一个公开的枚举类型,注意,enum前必须加上DataContract特性,枚举类型每个常量都必须使用EnumMember特性来表示

6.2 添加一个NewsDto实体类, 演示实体的基本写法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;
 
namespace NewsInterface
{
    [DataContract]
    public class NewsDto
    {
        /// <summary>
        /// 新闻标题
        /// </summary>
        [DataMember]
        public string NewsTitle { get; set; }
 
        /// <summary>
        /// 新闻内容
        /// </summary>
        [DataMember]
        public string Content { get; set; }
 
        /// <summary>
        /// 新闻类型,这里顺便演示下枚举
        /// </summary>
        [DataMember]
        public NewsTypeEnum NewsType { get; set; }
 
        /// <summary>
        /// 发布时间
        /// </summary>
        [DataMember]
        public DateTime publishTime { get; set; }
 
        /// <summary>
        /// 最后更新时间
        /// </summary>
        [DataMember]
        public DateTime LastUpdateTime { get; set; }
 
        /// <summary>
        /// 作者
        /// </summary>
        [DataMember]
        public string Author { get; set; }
 
        /// <summary>
        /// 最后修改作者
        /// </summary>
        [DataMember]
        public string LastAuthor { get; set; }
 
        /// <summary>
        /// 阅读量
        /// </summary>
        [DataMember]
        public int ReadCount { get; set; }
    }
}

6.3 打开INewsInterface,添加公开方法,演示 普通的接口,这里在WCF中专业名叫数据契约

我们只演示基本的简单的更删改查,还有个显示新闻关联图片5个方法,再次声明,我不讲新闻发布的新闻逻辑,这里只是演示WCF的用法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;
 
namespace NewsInterface
{
    [ServiceContract]
    public interface INewsInterface
    {
        /// <summary>
        /// 添加一条新闻
        /// </summary>
        /// <param name="dto">新闻实体</param>
        /// <returns>添加成功后返回添加成功后的ID</returns>
        [OperationContract]
        int NewsAdd(NewsDto dto);
 
        /// <summary>
        /// 删除一条新闻
        /// </summary>
        /// <param name="dto">新闻实体</param>
        /// <returns>是否删除成功</returns>
        [OperationContract]
        bool NewsDelete(NewsDto dto);
 
        /// <summary>
        /// 更新一条新闻
        /// </summary>
        /// <param name="dto">新闻实体</param>
        /// <returns>是否更新成功</returns>
        [OperationContract]
        bool NewsUpdate(NewsDto dto);
 
        /// <summary>
        /// 获得所有新闻
        /// </summary>
        /// <returns>返回新闻列表</returns>
        [OperationContract]
        List<NewsDto> NewsList();
 
        /// <summary>
        /// 根据ID获得新闻的图片
        /// </summary>
        /// <param name="Id">新闻编号</param>
        /// <returns>新闻相关联的图片</returns>
        [OperationContract]
        byte[] GetNewsImage(string Id);
 
    }
}

7.创建服务

右击 Services解决方案文件夹,添加一个类库,名字叫NewsServices

将Class1.cs文件名改下

7.1 先编译解决方案,然后 添加引用

7.2 实现接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;
using NewsInterface;
 
namespace NewsServices
{
    public class NewsImpl:INewsInterface
    {
 
        public int NewsAdd(NewsDto dto)
        {
            throw new NotImplementedException();
        }
 
        public bool NewsDelete(NewsDto dto)
        {
            throw new NotImplementedException();
        }
 
        public bool NewsUpdate(NewsDto dto)
        {
            throw new NotImplementedException();
        }
 
        public List<NewsDto> NewsList()
        {
            throw new NotImplementedException();
        }
 
        public byte[] GetNewsImage(string Id)
        {
            throw new NotImplementedException();
        }
    }
}

8. 添加宿主Hosts文件夹下,我们以控制台演示,宿主可以是很多种形式的,具体以后讲

同时修改属性 用.NET Framework4

然后添加引用

打开Program.cs填入一下基本代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;
using NewsServices;
 
namespace NewsHosts
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("服务宿主正在打开...");
            try
            {
                //ToDo 等待开启服务代码
 
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);                
            }
            Console.WriteLine("打开成功!");
            Console.ReadKey();
        }
    }
}

使用ServiceHost对象,添加Program类中

在try…catch代码块中添加如下代码:

添加宿主服务配置,我们利用WCF工具配置,也可以手动写

默认生成的App.config右击它,没有使用WCF工具配置,我们打开

vs2010菜单栏中的 WCF服务配置编辑器

使用之前,请确保你的解决方案重新生成了

下面我录个屏,讲一下配置

这里注意记住终结点这个地址,通过这个地址,我们的其他客户端,就可以获得我们想要的数据,我们可以直接把数据发在这个地址上,返回JSON或者XML,或者是.NET对象,然后你继续处理,如果JSON或者XML,那么WEB就可以使用$.ajax等jQuery的方法获得数据了,用于显示在网页上了

设置启动项,运行

先把服务能启动成功!

代码下载: 点我下载

明天2013年6月28日主要讲

9.创建数据库

10. 创建服务

11.客户端使用服务,实现更删改查,显示图片

时间真的不早了,我要睡觉了。一点一点写吧

晚安,大家!

 
 
分类: WCF教程
标签: WCF系列
 
 
 
 
8
 
 
«上一篇:AaronYan

那天有个小孩教我WCF[一][1/3]的更多相关文章

  1. 那天有个小孩教我WCF[一][2/3]

    接着上次的继续讲吧 我们开始吧 9.创建数据库 use master go --创建库 if exists(select * from sysdatabases where name='NewsDB' ...

  2. (转)那天有个小孩教我WCF[一][1/3]

    原文地址:http://www.cnblogs.com/AaronYang/p/2950931.html 既然是小孩系列,当然要有一点基础才能快速掌握,归纳,总结的一个系列,哈哈 前言: 第一篇嘛,不 ...

  3. WCF系列教程之WCF服务协定

    本文参考自:http://www.cnblogs.com/wangweimutou/p/4422883.html,纯属读书笔记,加深记忆 一.服务协定简介: 1.WCF所有的服务协定层里面的服务接口, ...

  4. WCF系列教程之WCF服务宿主与WCF服务部署

    本文参考自http://www.cnblogs.com/wangweimutou/p/4377062.html,纯属读书笔记,加深记忆. 一.简介 任何一个程序的运行都需要依赖一个确定的进程中,WCF ...

  5. 那天有个小孩跟我说LINQ(五)转载

    2  LINQ TO SQL(代码下载)      我们以一个简单的销售的业务数据库为例子         表结构很简单:Users(购买者(用户)表),Products(产品信息表),Sales(销 ...

  6. WCF系列教程之WCF服务配置工具

    本文参考自http://www.cnblogs.com/wangweimutou/p/4367905.html Visual studio 针对服务配置提供了一个可视化的配置界面(Microsoft ...

  7. WCF系列教程之WCF实例化

    本文参考自http://www.cnblogs.com/wangweimutou/p/4517951.html,纯属读书笔记,加深记忆 一.理解WCF实例化机制 1.WCF实例化,是指对用户定义的服务 ...

  8. WCF系列教程之WCF中的会话

    本文参考自http://www.cnblogs.com/wangweimutou/p/4516224.html,纯属读书笔记,加深记忆 一.WCF会话简介 1.在WCF应用程序中,回话将一组消息相互关 ...

  9. WCF系列教程之WCF客户端异常处理

    本文参考自:http://www.cnblogs.com/wangweimutou/p/4414393.html,纯属读书笔记,加深记忆 一.简介 当我们打开WCF基础客户通道,无论是显示打开还是通过 ...

随机推荐

  1. Theano学习笔记(一)——代数

    标量相加 import theano.tensor as T from theano import function x = T.dscalar('x') y = T.dscalar('y') z = ...

  2. jquery+html三级联动下拉框及详情页面加载时的select初始化问题

    html写的三个下拉框,如下: <select name="ddlQYWZYJ" id="ddl_QYWZYJ" class="fieldsel ...

  3. Arcgis for JS实现台风运动路径与影像范围的显示

    首先,看看详细的效果: 初始化状态 绘制中 绘制完毕 首先,组织数据.我组织的数据是JSON的,数据的详细形式例如以下: 其次,实现思路. 1.加入显示路径. 依据起始点,生成polyline的JSO ...

  4. 关于Java String对象创建的几点疑问

    我们通过JDK源码会知道String实质是字符数组,而且是不可被继承(final)和具有不可变性(immutable).可以如果想要了解String的创建我们需要先了解下JVM的内存结构. 1.JVM ...

  5. QT添加exe文件的图标LOGO

    首先你需要一个ICO文件,这样的一个: 使用百度搜索到的在线工具直接生成一个ICO文件保存到本地就可以了 将这人LOGO.ico文件保存到自己的resource文件夹下 然后在工程中新建一个qrc文件 ...

  6. 阿里云WinServer2008下配置IIS7支持php

    先送一只法克鱿给百度,百度了n多的方法都或多或少有问题. 0.php安装包 php-5.2.1-Win32.zip 下载地址 http://pan.baidu.com/s/1pJuc8YZ 最开始是p ...

  7. Coding the Matrix Week 1 The Vector Space作业

    Coding the Matrix: Linear Algebra through Computer Science Applications 本周的作业较少,只有一个编程任务hw2.作业比较简单,如 ...

  8. Visual Studio 编辑器

    如何扩展 Visual Studio 编辑器 在 Visual Studio 2010 的时代,扩展 Visual Studio 的途径有很多,开发者可以选择宏.Add-in.MEF 和 VSPack ...

  9. Ubuntu下安装Python绘图库Matplotlib的方法

    在安装好Python的基础上, sudo apt-get install python-numpy sudo apt-get install python-scipy sudo apt-get ins ...

  10. java反射拼接方法名动态执行方法

    近期由于负责项目的一个模块,该模块下有很多分类,每个分类都有一个编码code,这个值是作为一个参数携带过来的.但是每个code确实对应一个方法的. code的值有很多个,自己又不想做ifelse或者s ...