本例中,我们通过一个关于Camera的服务为例子来说明WCF的开发流程,该服务比较简单,只是用来实现对Camera的添加,枚举,删除等操作。

详细步骤如下:

1:创建一个WCF Service Library类型的工程,名为WcfCameraService:

创建完成之后,工程结构目录如下,VS会自动生成IService.cs和Service.cs两个文件:

2:工程右键[Add]--->[Class], 添加一个Camera类

Camera.cs代码如下:

一个类型只有声明为[DataContract](数据契约), 该类型才可以被序列化并在服务器端和客户端传输,另外,需要传输的成员都要声明成[DataMember]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Runtime.Serialization; namespace WcfCameraService
{ [DataContract]
public class Camera
{
[DataMember]
public string CameraID; [DataMember]
public String CameraLocation; [DataMember]
public String CameraInterfaceType;
}
}

4:服务接口(IService1.cs)代码如下:

接口类前要加[ServiceContract]标签,每个成员前要加[OperationContract]标签,以保证外部调用可以访问到该方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text; namespace WcfCameraService
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        void AddCamera(Camera camera);         [OperationContract]
        List<Camera> ScanAllCameras();         [OperationContract]
        void DeleteCameras(string id);         // TODO: Add your service operations here
    }
}

5:接口服务实现类(Service1.cs)代码如下:

该类实现接口的真正功能

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text; namespace WcfCameraService
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in both code and config file together.
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    public class Service1 : IService1
    {
 
        List<Camera> _Cameras = new List<Camera>();
        public void AddCamera(Camera camera)
        {
            _Cameras.Add(camera);
        }         public List<Camera> ScanAllCameras()
        {
            return _Cameras;
        }         public void DeleteCameras(string id)
        {
            Camera camera = _Cameras.Find(p => p.CameraID == id);
            _Cameras.Remove(camera);
        }
    }
}

6:按F5运行程序,会跳出如下两个界面:

首先托盘下出现如下图标,系统会运行一个WCF服务器,来为我们的WCF提供托管载体。

另外一个就是如下所示的WCF Test Client,我们看到系统已将我们的IService1加载了进来,并且对外提供了AddCamera(),ScanAllCameras(),DeleteCamera()三个可调用方法。

7:双击ScanAllCameras(), 点击[Invoke] , 由于还没有添加任何Camera的信息,我们可以看到下框的状态栏中空空如也:

8:双击AddCamera(),并添加Camera1,后点击[Invoke]。

9:再双击AddCamera(),继续添加Camera2的信息:

10:现在到了检验结果的时候了,双击ScanAllCameras(), 点击[Invoke]之后,我们看到如下信息:

我们看到之前添加的两个Camera的信息已经显示出来,说明该服务已成功运行。

WCF(1)----服务创建的更多相关文章

  1. WCF服务创建与使用(双工模式)

    昨天发布了<WCF服务创建与使用(请求应答模式)>,今天继续学习与强化在双工模式下WCF服务创建与使用,步骤与代码如下. 第一步,定义服务契约(Service Contract),注意Se ...

  2. WCF服务创建与使用(请求应答模式)

    不说废话,直接上代码.以下服务创建是在独立的WCF类库中,若采用WCF应程程序,定义及创建服务代码均相同,但文件名不同,是CalculatorService.svc 第一步,定义服务契约(Servic ...

  3. WCF初探-13:WCF客户端为双工服务创建回调对象

    前言: 在WCF初探-5:WCF消息交换模式之双工通讯(Duplex)博文中,我讲解了双工通信服务的一个应用场景,即订阅和发布模式,这一篇,我将通过一个消息发送的例子讲解一下WCF客户端如何为双工服务 ...

  4. 使用WCF Data Service 创建OData服务

    使用WCF Data Service 创建OData服务 在 上一章 中,介绍了如何通过 OData 协议来访问 OData 服务提供的资源.下面来介绍如何创建一个 OData 服务.在这篇文章中,主 ...

  5. (纯代码)快速创建wcf rest 服务

    因为有一个小工具需要和其它的业务对接数据,所以就试一下看能不能弄一个无需配置快速对接的方法出来,百(以)度(讹)过(传)后(讹),最后还是对照wcf配置对象调试出来了: 1.创建WebHttpBind ...

  6. 如何:加载分页结果(WCF 数据服务)

    WCF 数据服务 允许数据服务限制单个响应源中返回的实体数.在此情况下,源中的最后一项包含指向下一页数据的链接.通过调用执行 DataServiceQuery 时返回的 QueryOperationR ...

  7. WCF服务与WCF数据服务的区别

    问: Hi, I am newbie to wcf programming and a little bit confused between WCF Service and WCF Data  Se ...

  8. WCF 数据服务 4.5

    .NET Framework 4.5 其他版本 WCF 数据服务(以前称为"ADO.NET Data Services")是 .NET Framework 的一个组件.可以使用此组 ...

  9. 【WCF--初入江湖】06 WCF契约服务行为和异常处理

    06 WCF契约服务行为和异常处理 一.WCF契约服务行为 [1] 服务行为可以修改和控制WCF服务的运行特性. 在实现了WCF服务契约后,可以修改服务的很多执行特性. 这些行为(或者特性)是通过配置 ...

随机推荐

  1. The FlexSession is invalid问题

    package com.cmbj.soa.servicemonitor.view.service.impl; import java.util.Enumeration; import javax.se ...

  2. Android学习之一:Cygwin简介

    为了能够一窥Android底层的东东,还是要搭建编译Android的环境.虽有Ubuntu和Suse系统,无奈总感觉在不同的系统下切来切去很是不便.在Windows工作学习,要编译Android,就不 ...

  3. qt之正则表达式

    原地址:http://blog.csdn.net/phay/article/details/7304455 QRegExp是Qt的正则表达式类.Qt中有两个不同类的正则表达式.第一类为元字符.它表示一 ...

  4. Android ListView 之 SimpleAdapter 二 (包含 item 中按钮监听)

    1    MainActivity.java package com.myadapter; import java.util.ArrayList; import java.util.HashMap; ...

  5. 基于jquery-easyui的仓库管理系统

    使用jQuery EasyUI创建的仓库管理系统包括系统管理.数据维护.业务单据管理等,有兴趣可以对其进行修改扩展. 数据库采用MYSQL, 帐号/密码:root/root,演示登录帐号/密码:adm ...

  6. hibernate解决oracle的id自增?

    以前做SSH项目时,涉及到的数据库是mySQL,只需将bean的配置文件id设为native 就可以实现表id的自增. 现在用到了Oracle,当然知道这样是不行的啦,那么用序列自增? 我在网络上搜索 ...

  7. js实现表格的选中一行-------Day58

    最開始想很多其它的用js来动态操作表格,是由于在应用了easyUI之后,发现直接写一个<table id="tt"></table>,这就够了,界面里面就剩 ...

  8. [置顶] 关于本博客 http://www.imobilebbs.com

    由于时间上的关系,本博客不再和引路蜂移动软件博客同步更新,    请直接访问 http://www.imobilebbs.com 谢谢您的支持,再见   引路蜂博客

  9. 面试经典-设计包含min函数的栈

    问题:设计包含min函数的栈(栈) 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素. 要求函数min.push以及pop的时间复杂度都是O(1). 解答:push 和pop的时间复杂度 ...

  10. 碰撞回避算法(一) Velocity Obstacle

    碰撞回避是机器人导航,游戏AI等领域的基础课题.几十年来,有很多算法被提出.注意这里主要指的是局部的碰撞回避算法.尽管和全局的路径规划算法(A*算法等)有千丝万缕的联系.可是还是有所不同的(局部的碰撞 ...