标题有有意思,说是再次看WCF,意思是说之前也简单的看过,但没有用到实际项目中来,这一次,准备大规模的体验一下WCF。

今天主要是一个例子,从用户服务器,根据指定用户ID,还回它的用户实体,即,用户模块的代码是写好的,可以供其它项目,业务去调用,提供一个开放的服务平台,先看一下结构图

在WCF Service文件夹中,Contracts是指定义服务契约(Service Contract),引用System.ServiceMode程序集

Service提供对WCF服务的实现。即在契约Contracts的实现,所以Services具有对Contracts项目的引用;

Hosting实现对定义在Services项目中的服务的寄宿,它可以由控制台程序实现,也可以发布到IIS上。

Client是一个客户端程序,它有对Service的服务引用,主要从Service中获取服务

Entity和VCommons都是公用项目,在我的这篇博文中有说明

下面我们来一步一步创建这个WCF程序

一  建立Contracts契约,代码如下:

 [ServiceContract(Name = "UserService", Namespace = "http://www.wcf.com/")]public interface IUser{[OperationContract]bool Register(Entity.UserBases entity);[OperationContract]byte[] GetUserByID(int userID);[OperationContract]UserBases GetUserBaseByID(int userID);}

我们看到,它实事上就是一种操作的规范,我们在WCF里叫它服务规范或服务契约

二  建立Service项目,代码如下:

 public class UserService : IUser{static Entity.Car_RentalDataContext db;static UserService(){db = new Entity.Car_RentalDataContext(System.Configuration.ConfigurationManager.ConnectionStrings["Car_Rental"].ToString());}public bool Register(Entity.UserBases entity){try{db.UserBases.InsertOnSubmit(entity);db.SubmitChanges();return true;}catch (System.Exception){return false;throw;}}public byte[] GetUserByID(int userID){return VCommons.SerializationHelper.ObjectToByteArray(db.GetTable<UserBases>().Select(i => new UserBases_Ext{UserID = i.UserID,Name = i.Name,}).FirstOrDefault(i => i.UserID == userID));}
}

事实上,WCF服务就是要把服务契约进行实现,我进行了一个简单的测试,WCF也是走SOAP协议,所以 Register(Entity.UserBases entity)这种方法肯定是不行的,我们需要将它进

行序列化。

三 创建服务宿主,事实上,我们最习惯的宿主方式就是像WebService式的IIS宿主,原来WS里有ASMX,现在WCF里叫SVC,先看一个SVC文件内容如下:

1 <%@ ServiceHost Service="Artech.WcfServices.Services.UserService" %>

直接使用ServiceHost即可,注册,在项目中,要引用System.ServiceModel程序集。

再看一下控制台程序的宿主代码:

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             using (ServiceHost host = new ServiceHost(typeof(UserService)))
 6             {
 7
 8                 host.AddServiceEndpoint(typeof(IUser), new WSHttpBinding(), "http://127.0.0.1:9999/UserService");
 9                 if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
10                 {
11                     ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
12                     behavior.HttpGetEnabled = true;
13                     behavior.HttpGetUrl = new Uri("http://127.0.0.1:9999/UserService/metadata");
14                     host.Description.Behaviors.Add(behavior);
15                 }
16                 host.Opened += delegate
17                {
18                    Console.WriteLine("Service已经启动");
19
20                };
21
22                 host.Open();
23                 Console.Read();
24             }
25
26         }
27
28     }

而对于,客户端来说,我们需要对Service项目进行服务引用

如果你的服务是一个获取数据源的服务,WCF还会在你的项目中生成一个.datasource的数据源,client项目代码如下:

1            using (UserServiceClient proxy = new UserServiceClient())
2             {
3                 UserBases_Ext entity = (UserBases_Ext)VCommons.SerializationHelper.ByteArrayToObject(proxy.GetUserByID(1));
4                 Console.Write(entity == null ? "没有找到" : entity.Name);
5
6                 UserBases entity2 = proxy.GetUserBaseByID(1);//soap不支持复杂类型
7                 Console.Write(entity2 == null ? "没有找到" : entity2.Name);
8                 Console.ReadKey();
9             }

OK,到这里,我们的第一个WCF实例就完成了。

注意:linq to sql生成的实体,再进行序列化时,会报异常的,我们需要为它和它的派生类重新做序列化标记,然后返回数据时,使用派生类型和可以,代码如下:

1     [Serializable]
2     public partial class UserBases
3     {
4         //linq实体扩展功能
5     }
6     [Serializable]
7     public class UserBases_Ext : UserBases //UserBases_Ext和UserBases需要同时被标记为可序列化
8     { }

转载于:https://www.cnblogs.com/lori/archive/2012/06/19/2555014.html

WCF走你~一个简单的例子,根据用户ID,从用户模块(用户服务器)获得实体相关推荐

  1. 一步一步解读神经网络编译器TVM(一)——一个简单的例子

    @TOC 前言 这是一个TVM教程系列,计划从TVM的使用说明,再到TVM的内部源码?为大家大致解析一下TVM的基本工作原理.因为TVM的中文资料比较少,也希望贡献一下自己的力量,如有描述方面的错误, ...

  2. .net中的对象序列化(1): 序列化是什么, 以及一个简单的例子

    1. 为什么需要序列化,什么是序列化 对于一个程序来说, 使用到的对象都是存在于内存中的.如果想保存这些对象的运行时状态, 或者需要在不同进程或者网络间传递对象,就需要序列化. 序列化就是讲运行中的对 ...

  3. 一个简单的例子看java线程机制

    一个简单的例子看java线程机制 作者: zyf0808 发表日期: 2006-03-26 11:20 文章属性: 原创 复制链接 import java.util.*; public class T ...

  4. blockchain 区块链200行代码:在JavaScript实现的一个简单的例子

    blockchain 区块链200行代码:在JavaScript实现的一个简单的例子 了解blockchain的概念很简单(区块链,交易链块):它是分布式的(即不是放置在同一台机器上,不同的网络设备上 ...

  5. pycharm安装scrapy失败_Scrapy ——环境搭配与一个简单的例子

    在我刚接触爬虫的时候就已经听过Scrapy大名了,据说是一个很厉害的爬虫框架,不过那个时候沉迷于Java爬虫.现在终于要来揭开它神秘的面纱了,来一起学习一下吧 欢迎关注公众号:老白和他的爬虫 1.环境 ...

  6. java继承类型转换_#java 一个简单的例子理解java继承、成员函数重写、类型转换...

    一个简单的例子理解java继承.成员函数重写.类型转换 1.继承简介 举一个简单的例子:笔分为很多种,比如毛笔.钢笔.圆珠笔等等,这些笔都有一些相同的属性比如长度.笔迹的粗细等等:但他们也有不同的特点 ...

  7. 类模板与运算符重载(一个简单的例子)

    类模板与运算符重载(一个简单的例子) 标签(空格分隔): C++ 算法竞赛 下面是一段简单的代码,表示我们建立了一个类模板Vector,可以看做是对STL中vector的简单实现. 为了让这个Vect ...

  8. 一个简单的例子,学习自定义注解和AOP

    转载自   一个简单的例子,学习自定义注解和AOP 记得今年年初刚开始面试的时候,被问的最多的就是你知道Spring的两大核心嘛?那你说说什么是AOP,什么是IOC?我相信你可能也被问了很多次了. 1 ...

  9. antlr4例子_ANTLR和网络:一个简单的例子

    antlr4例子 网络上的ANTLR:为什么? 我开始在MS-DOS上编写我的第一个程序. 因此,我非常习惯在自己的机器上安装工具. 但是在2016年,网络无处不在,因此那里也可能需要我们的语言. 可 ...

最新文章

  1. 实时监控fps的linux代码,GitHub - Forec/monitor-recorder: Monitor (实时视频监控、运动检测视频记录)...
  2. git的基本使用-1
  3. 优化UGC流程,获得图文并茂游记so easy
  4. 神策数据杨宁:券商财富管理数字化转型客户全生命周期解读
  5. MSN都出8.1啦!
  6. iframe 自适应高度 跨域
  7. C++设计模式-访问者模式
  8. 突发!百度AI开发者大会李彦宏遭泼水 百度官方回应...
  9. 特斯拉Model 3产能跟不上,是因为用了太多机器人
  10. Qt的QDataStream
  11. windows 域介绍
  12. php 替换表情符号,php怎么实现正则替换特殊符号
  13. 【魔方代码】1200行C语言代码实现“魔方”程序,学会它买魔方的钱都省了,拿走不谢~
  14. word文档生成系列:doc和docx插入多图
  15. iOS 获取指南针的数据
  16. 搭建Prometheus+Grafana实时监控平台监控Java应用服务
  17. Neo4j 4.0 / 4.1 配置快速参考 - 单服务器模式,适用于社区版和企业版
  18. js正则表达式的使用:
  19. 黑马程序员---网络编程
  20. SMB2协议特性之oplock与lease(下)

热门文章

  1. mysql提取前两个数据_各种数据库提取表的前几条记录的方法
  2. vb中line的用法[转]
  3. XP共享拒绝访问,全面解决
  4. SCPPO(十):网站发布中的问题锦集—手动发布网站
  5. 2018中国年度AI评选揭晓!10大领航企业,50家明星公司,10佳投资机构
  6. 5天被迫喊停!Win 10史上最短命系统升级:删文件、无法联网,误报CPU使用率
  7. AI发来贺电,您的2333号奶牛已进入恋爱时节 | 野性的呼唤
  8. 当心币圈高仿号!也别指望AI,它有心无力
  9. ubuntu 16.04 登录后黑屏
  10. sed修炼系列(三):sed高级应用之实现窗口滑动技术