使用WCF进行跨平台开发之一(WCF的实现、控制台

系统 1413 0

WCF是Windows Communication Foundation的缩写,是微软发展的一组数据通信的应用程序开发接口,它是.NET框架的一部分,是WinFx的三个重要开发类库之一,其它两个是WPF和WF。在本系列文章

(我现在计划的应该是三篇,一篇WCF的开发和部署,另外是在.net平台上调用它,第二篇是PHP调用,第三篇是J AVA调用)。

在本次的跨平台集成通信开发示例中,使用到的各种技术,咱且走且看,一边开发一边讲解。

1.创建项目结构

使用VS2010一个名为IntergatedCommunication的空解决方案,在其下,新建Contracts、Implemention两个类库项目,分别为契约的设计与服务的实现,而后新建ConsoleHost、Client两个控制台应用程序,分别为在控制台中实现服务托管使用,一个作为.net平台上调用WCF的实例使用,如下图

image

2.契约的设计

本实例我还是想让它确实可以应用在实际项目中,所以我在设计的时候,将使用复杂类型(complex type),因为这并不同于普通类型,尤其在java和php在使用复杂类型参数是,调用方法是很不一样的。

首先对Contracts、Implemention和ConsoleHost项目中添加对System.ServiceModel和System.Runtime.Serialization的引用。这两个命名空间中包含ServiceContractAttribute等WCF需要的契约特性类,和对复杂类型序列化的类DataContractSerializer。

image

本示例使用员工信息(员工ID、员工姓名、所属部门)查询本员工上月的工资明细(员工ID、薪水、日期),所以首先建立两个类Employee类和SalaryDetail类,在类中引用System.Runtime.Serialization命名空间,并且,在类上添加DataContractAttribute并在每个类属性上添加DataMemberAttribute:

Employee.cs

        
          using
        
         System.Runtime.Serialization;
      
      
        
          namespace
        
         Contracts
      
        {
      
            [DataContract]
      
        
          public
        
        
          class
        
         Employee
      
            {
      
                [DataMember]
      
        
          public
        
        
          string
        
         Id { get; set; }
      
                [DataMember]
      
        
          public
        
        
          string
        
         Name { get; set; }
      
                [DataMember]
      
        
          public
        
        
          string
        
         Department { get; set; }
      
            }
      
        }
      
SalaryDetail.cs
        
          using
        
         System.Runtime.Serialization;
      
      
        
          namespace
        
         Contracts
      
        {
      
            [DataContract]
      
        
          public
        
        
          class
        
         SalaryDetail
      
            {
      
                [DataMember]
      
        
          public
        
        
          string
        
         Id { get; set; }
      
                [DataMember]
      
        
          public
        
        
          decimal
        
         Salary { get; set; }
      
                [DataMember]
      
        
          public
        
         DateTime Date { get; set; }
      
            }
      
        }
      
以上所设计的是数据契约,在使用DataContract和DataMember修饰和类和属性后,可将这些类型和属性暴露在元数据中,而后设计服务契约
定义一个借口名为IEmployeeManagement并添加一个方法签名GetSalaryOfLastMonth,并添加ServiceContractAttribute和OperationContractAttribute。
IEmployeeManagement.cs
        
          using
        
         System.ServiceModel;
      
      
        
          namespace
        
         Contracts
      
        {
      
            [ServiceContract]
      
        
          public
        
        
          interface
        
         IEmployeeManagement
      
            {
      
                [OperationContract]
      
                SalaryDetail GetSalaryOfLastMonth(Employee emp);
      
            }
      
        }
      

3.实现服务

在Implemention中添加对Contracts项目的引用,添加EmployeeManagement类,实现IEmployeeManagement接口

EmployeeManagement.cs

        
          using
        
         Contracts;
      
      
        
          namespace
        
         Implemention
      
        {
      
        
          public
        
        
          class
        
         EmployeeManagement:IEmployeeManagement
      
            {
      
        
          public
        
         SalaryDetail GetSalaryOfLastMonth(Employee emp)
      
                {
      
                    SalaryDetail salaryDetail = 
        
          new
        
         SalaryDetail();
      
                    salaryDetail.Id = emp.Id;
      
                    salaryDetail.Date = DateTime.Now.AddMonths(-1);
      
                    salaryDetail.Salary = 20000;
      
        
          return
        
         salaryDetail;
      
                }
      
            }
      
        }
      
因为这里实现的内容并不重要,所以没有具体的去实现它,知识简单的返回了一个SalaryDetail的实例,Id为传入参数的员工ID,时间为当前时间的前一个月,薪水为固定的20000。

4.控制台托管服务

在ConsoleHost中添加对以上两个项目的引用,这时,生成整个解决方案,然后在ConsoleHost中添加应用程序配置文件App.config。并使用WCF服务配置编辑器打开它,并配置服务托管地址和绑定类型等信息,最终配置结果为

        
          <?
        
        
          xml
        
        
          version
        
        
          ="1.0"
        
        
          encoding
        
        
          ="utf-8"
        
         ?
        
          >
        
      
        
          <
        
        
          configuration
        
        
          >
        
      
        
          <
        
        
          system.serviceModel
        
        
          >
        
      
        
          <
        
        
          behaviors
        
        
          >
        
      
        
          <
        
        
          serviceBehaviors
        
        
          >
        
      
        
          <
        
        
          behavior
        
        
          name
        
        
          ="ExposeMetaDataBehavior"
        
        
          >
        
      
        
          <
        
        
          serviceMetadata
        
        
          httpGetEnabled
        
        
          ="true"
        
        
          httpGetUrl
        
        
          ="EmployeeManagement/MEX"
        
        
          />
        
      
        
          </
        
        
          behavior
        
        
          >
        
      
        
          </
        
        
          serviceBehaviors
        
        
          >
        
      
        
          </
        
        
          behaviors
        
        
          >
        
      
        
          <
        
        
          services
        
        
          >
        
      
        
          <
        
        
          service
        
        
          behaviorConfiguration
        
        
          ="ExposeMetaDataBehavior"
        
        
          name
        
        
          ="Implemention.EmployeeManagement"
        
        
          >
        
      
        
          <
        
        
          endpoint
        
        
          address
        
        
          ="EmployeeManagement"
        
      
        
          binding
        
        
          ="wsHttpBinding"
        
        
          bindingConfiguration
        
        
          =""
        
        
          contract
        
        
          ="Contracts.IEmployeeManagement"
        
        
          />
        
      
        
          <
        
        
          host
        
        
          >
        
      
        
          <
        
        
          baseAddresses
        
        
          >
        
      
        
          <
        
        
          add
        
        
          baseAddress
        
        
          ="http://localhost:9876/"
        
        
          />
        
      
        
          </
        
        
          baseAddresses
        
        
          >
        
      
        
          </
        
        
          host
        
        
          >
        
      
        
          </
        
        
          service
        
        
          >
        
      
        
          </
        
        
          services
        
        
          >
        
      
        
          </
        
        
          system.serviceModel
        
        
          >
        
      
        
          </
        
        
          configuration
        
        
          >
        
      

打开program.cs,在main方法中添加代码,托管服务

        
          using
        
         System.ServiceModel;
      
        
          using
        
         Implemention;
      
      
        
          namespace
        
         ConsoleHost
      
        {
      
        
          class
        
         Program
      
            {
      
        
          static
        
        
          void
        
         Main(
        
          string
        
        [] args)
      
                {
      
                    ServiceHost host = 
        
          new
        
         ServiceHost(
        
          typeof
        
        (Implemention.EmployeeManagement));
      
        
          try
        
      
                    {
      
                        Console.WriteLine(
        
          "EmployeeManagement Service Starting"
        
        );
      
                        host.Open();
      
                        Console.WriteLine(
        
          "EmployeeManagement Service Started"
        
        );
      
                        Console.ReadKey();
      
                    }
      
        
          catch
        
         (Exception ex)
      
                    {
      
                        Console.WriteLine(ex.Message);
      
        
          if
        
         (ex.InnerException != 
        
          null
        
        )
      
                        {
      
                            Console.WriteLine(
        
          "\n"
        
         + ex.InnerException.Message);
      
                        }
      
                    }
      
        
          finally
        
      
                    {
      
                        host.Close();
      
                    }
      
                    Console.ReadKey();
      
                }
      
            }
      
        }
      

生成解决方案,并在VS外以管理员权限启动ConsoleHost.exe文件,这样就在控制台中托管了服务

5.在.net平台中调用WCF

在Client中,添加服务引用,命名空间设置为ServiceReference

image

在program.cs中添加代码,调用控制台中托管的服务

        
          namespace
        
         Client
      
        {
      
        
          class
        
         Program
      
            {
      
        
          static
        
        
          void
        
         Main(
        
          string
        
        [] args)
      
                {
      
                    ServiceReference.EmployeeManagementClient client = 
        
          new
        
         ServiceReference.EmployeeManagementClient();
      
                    ServiceReference.Employee emp = 
        
          new
        
         ServiceReference.Employee() { Id = 
        
          "dev001"
        
        , Name = 
        
          "James White"
        
        , Department = 
        
          "Development"
        
         };
      
                    ServiceReference.SalaryDetail salaryDetail = client.GetSalaryOfLastMonth(emp);
      
                    Console.WriteLine(
        
          "Employee number {0}'s salary of {1} month is ¥{2}"
        
        , salaryDetail.Id, salaryDetail.Date.Month, salaryDetail.Salary);
      
                    Console.ReadKey();
      
                }
      
            }
      
        }
      
image

在这里,我们已经简单的实现了WCF服务的实现和.net本平台调用WCF,这一篇不是最重要的,下一篇是使用IIS托管WCF并使用PHP调用WCF。

使用WCF进行跨平台开发之一(WCF的实现、控制台托管与.net平台的调用)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论