`
king_tt
  • 浏览: 2192272 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

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

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程序:WcfServices、WcfServices2

    它允许开发人员创建跨平台的、安全的、可靠的和可扩展的服务。在这个教程中,我们将深入理解如何创建一个基本的WCF服务并进行自我托管。 首先,我们需要理解WCF服务的核心概念。WCF服务是由接口(定义服务契约)、...

    WCF分布式开发步步为赢.pdf

    ### WCF分布式开发步步为赢 #### 一、WCF分布式框架基础概念 ...综上所述,WCF为.NET开发人员提供了一个强大而灵活的分布式开发框架。通过掌握上述概念和技术,开发人员可以构建出高性能、安全且可靠的分布式应用。

    wcf入门笔记和程序运行分析

    【.NET Framework】.NET Framework是微软开发的一个软件框架,它包含了运行托管代码所需的所有组件,包括类库、运行时环境和编译器。WCF作为.NET Framework的一部分,依赖于框架提供的基础设施来执行服务。 【宿主...

    WCF服务(初学者使用,很好的一个例子)

    WCF允许开发者创建跨多个平台和网络的互操作性服务,实现服务导向架构(SOA)。初学者可能会对WCF的复杂性和众多配置选项感到困惑,但通过以下步骤,我们可以逐步理解并掌握其基础。 首先,我们要了解的是**WCF服务...

    WCF在分布式系统中的应用.pdf

    WCF允许开发者选择不同的传输和消息编码方式,支持跨平台通信,即使服务运行在不同的操作系统上,也能通过WCF进行通信。 SOA中的关键在于服务层,它通过网络将松散耦合的应用程序组件进行分布式部署、组合和使用。...

    WCF 学习笔记(包括WCF基本知识、Security、MSMQ、Transaction等等)

    - **基本应用**:MSMQ(Microsoft Message Queuing)是Windows平台上的消息队列服务,可以与WCF结合使用来实现可靠的异步通信。 - **队列与事务**:讨论MSMQ队列与事务处理的关系,以及如何在WCF中利用MSMQ实现持久...

    WCF 指南教程(PDF)

    - **与.NET Remoting相比**:WCF提供了一种更统一的方法来处理远程对象调用,并且具有更强的安全性和可配置性。 - **与ASMX Web Services相比**:WCF提供了更丰富的功能,比如事务支持、更灵活的消息模式和更全面的...

    微软.NET平台微服务架构实践.docx

    通过以上介绍,我们可以看出微软.NET平台上的微服务架构实践是如何围绕MsaFx.dll框架进行的,包括服务的创建、托管、路由管理和客户端的使用。这种架构使得开发人员能够构建出更加灵活、可扩展且易于维护的分布式...

    WCF教程英文pdf

    - **跨平台通信**:讨论了WCF如何与其他技术栈(如Java EE)进行通信,实现跨平台服务集成。 #### 八、总结 - 本书不仅深入介绍了WCF的基础知识和技术细节,还涵盖了大量实践经验和最佳实践。对于希望利用WCF构建高...

    使用.NET Remoting 建立分布式应用程序(二)

    .NET Remoting是微软.NET框架提供的一种技术,用于构建和运行跨进程或跨网络的分布式应用程序。它是.NET平台上的一个核心特性,允许不同进程间的对象互相通信,仿佛它们是在同一个地址空间内。在“使用.NET Remoting...

    c#教程(PDF中文版,含例题)

    要有效地使用C#进行开发,理解.NET的运行环境至关重要。 ##### 3.1 .NET结构 .NET结构主要包括以下部分: - **公共语言运行时(CLR)**:提供了应用程序运行所需的环境,包括内存管理、线程管理和异常处理等。 - ...

    “C#”教程完全手册

    3. **Rider**:JetBrains开发的一款跨平台C# IDE,专为.NET开发设计,具有高效编码和调试功能。 ### 编写第一个应用程序 #### Welcome程序 创建第一个C#程序通常是一个简单的“Hello World”程序,这有助于熟悉C#...

    WCFServiceSelfHosted

    它提供了统一的编程模型,能够创建跨平台、安全、可靠的网络服务。本文将深入探讨“WCFServiceSelfHosted”,即WCF服务的自承载方式,以及如何使用C#实现。 **一、什么是WCF服务自承载?** WCF服务自承载是指服务...

Global site tag (gtag.js) - Google Analytics