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

简介:

标题有有意思,说是再次看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     { }

 本文转自博客园张占岭(仓储大叔)的博客,原文链接:WCF走你~一个简单的例子,根据用户ID,从用户模块(用户服务器)获得实体,如需转载请自行联系原博主。

目录
相关文章
|
PHP Apache
PHP环境搭建(配置php模块到apache服务器)
PHP环境搭建(配置php模块到apache服务器)
111 0
|
存储 运维 数据挖掘
服务器数据恢复-服务器硬盘掉线导致银行业务模块崩溃的数据恢复案例
某银行的某一业务模块崩溃,无法正常使用。排查服务器故障,发现运行该业务模块的服务器中多块硬盘离线,导致上层应用崩溃。 故障服务器内多块硬盘掉线,硬盘掉线数量超过服务器raid阵列冗余级别所允许的硬盘掉线数量,导致服务器瘫痪。可以通过修复硬盘物理故障,提取故障盘数据后重组raid的方案来恢复服务器数据。
|
4月前
|
存储 缓存 Ubuntu
如何在 Apache Web 服务器中安装、配置和使用模块
如何在 Apache Web 服务器中安装、配置和使用模块
93 0
|
5月前
|
网络协议
使用`http.server`模块搭建简单HTTP服务器
使用`http.server`模块搭建简单HTTP服务器
|
监控 应用服务中间件 nginx
服务器端集群搭建、下载站点、用户认证模块
Nginx实现服务器端集群搭建 Nginx与Tomcat部署 Nginx在高并发场景和处理静态资源是非常高性能的,但是在实际项目中除了静态资源还有就是后台业务代码模块,一般后台业务都会被部署在Tomcat,weblogic或者是websphere等web服务器上。那么如何使用Nginx接收用户的请求并把请求转发到后台web服务器? 步骤分析: 1.准备Tomcat环境,并在Tomcat上部署一个web项目 2.准备Nginx环境,使用Nginx接收请求,并把请求分发到Tomat上 1 2 环境准备(Tomcat) 浏览器访问: http://192.168.200.146:8080/
125 0
|
Python
python自带模块获取服务器主机名称、IP地址和mac地址
python自带模块获取服务器主机名称、IP地址和mac地址
135 1
|
安全 Unix 应用服务中间件
安装Nginx服务器,并添加SSL模块
安装Nginx服务器,并添加SSL模块
143 0
|
网络协议 数据库
nf_conntrack模块导致服务器Drop Packet
nf_conntrack模块导致服务器Drop Packet
181 0
|
SpringCloudAlibaba Java Maven
SpringCloud Alibaba微服务实战三十 | 统一资源服务器配置模块
SpringCloud Alibaba微服务实战三十 | 统一资源服务器配置模块
236 0