WCF是Windows Communication Foundation的缩写,是微软发展的一组数据通信的应用程序开发接口,它是.NET框架的一部分,是WinFx的三个重要开发类库之一,其它两个是WPF和WF。在本系列文章
(我现在计划的应该是三篇,一篇WCF的开发和部署,另外是在.net平台上调用它,第二篇是PHP调用,第三篇是JAVA调用)。
在本次的跨平台集成通信开发示例中,使用到的各种技术,咱且走且看,一边开发一边讲解。
1.创建项目结构
使用VS2010一个名为IntergatedCommunication的空解决方案,在其下,新建Contracts、Implemention两个类库项目,分别为契约的设计与服务的实现,而后新建ConsoleHost、Client两个控制台应用程序,分别为在控制台中实现服务托管使用,一个作为.net平台上调用WCF的实例使用,如下图
2.契约的设计
本实例我还是想让它确实可以应用在实际项目中,所以我在设计的时候,将使用复杂类型(complex type),因为这并不同于普通类型,尤其在java和php在使用复杂类型参数是,调用方法是很不一样的。
首先对Contracts、Implemention和ConsoleHost项目中添加对System.ServiceModel和System.Runtime.Serialization的引用。这两个命名空间中包含ServiceContractAttribute等WCF需要的契约特性类,和对复杂类型序列化的类DataContractSerializer。
本示例使用员工信息(员工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
在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();
}
}
}
在这里,我们已经简单的实现了WCF服务的实现和.net本平台调用WCF,这一篇不是最重要的,下一篇是使用IIS托管WCF并使用PHP调用WCF。
分享到:
相关推荐
它允许开发人员创建跨平台的、安全的、可靠的和可扩展的服务。在这个教程中,我们将深入理解如何创建一个基本的WCF服务并进行自我托管。 首先,我们需要理解WCF服务的核心概念。WCF服务是由接口(定义服务契约)、...
### WCF分布式开发步步为赢 #### 一、WCF分布式框架基础概念 ...综上所述,WCF为.NET开发人员提供了一个强大而灵活的分布式开发框架。通过掌握上述概念和技术,开发人员可以构建出高性能、安全且可靠的分布式应用。
【.NET Framework】.NET Framework是微软开发的一个软件框架,它包含了运行托管代码所需的所有组件,包括类库、运行时环境和编译器。WCF作为.NET Framework的一部分,依赖于框架提供的基础设施来执行服务。 【宿主...
WCF允许开发者创建跨多个平台和网络的互操作性服务,实现服务导向架构(SOA)。初学者可能会对WCF的复杂性和众多配置选项感到困惑,但通过以下步骤,我们可以逐步理解并掌握其基础。 首先,我们要了解的是**WCF服务...
WCF允许开发者选择不同的传输和消息编码方式,支持跨平台通信,即使服务运行在不同的操作系统上,也能通过WCF进行通信。 SOA中的关键在于服务层,它通过网络将松散耦合的应用程序组件进行分布式部署、组合和使用。...
- **基本应用**:MSMQ(Microsoft Message Queuing)是Windows平台上的消息队列服务,可以与WCF结合使用来实现可靠的异步通信。 - **队列与事务**:讨论MSMQ队列与事务处理的关系,以及如何在WCF中利用MSMQ实现持久...
- **与.NET Remoting相比**:WCF提供了一种更统一的方法来处理远程对象调用,并且具有更强的安全性和可配置性。 - **与ASMX Web Services相比**:WCF提供了更丰富的功能,比如事务支持、更灵活的消息模式和更全面的...
通过以上介绍,我们可以看出微软.NET平台上的微服务架构实践是如何围绕MsaFx.dll框架进行的,包括服务的创建、托管、路由管理和客户端的使用。这种架构使得开发人员能够构建出更加灵活、可扩展且易于维护的分布式...
- **跨平台通信**:讨论了WCF如何与其他技术栈(如Java EE)进行通信,实现跨平台服务集成。 #### 八、总结 - 本书不仅深入介绍了WCF的基础知识和技术细节,还涵盖了大量实践经验和最佳实践。对于希望利用WCF构建高...
.NET Remoting是微软.NET框架提供的一种技术,用于构建和运行跨进程或跨网络的分布式应用程序。它是.NET平台上的一个核心特性,允许不同进程间的对象互相通信,仿佛它们是在同一个地址空间内。在“使用.NET Remoting...
要有效地使用C#进行开发,理解.NET的运行环境至关重要。 ##### 3.1 .NET结构 .NET结构主要包括以下部分: - **公共语言运行时(CLR)**:提供了应用程序运行所需的环境,包括内存管理、线程管理和异常处理等。 - ...
3. **Rider**:JetBrains开发的一款跨平台C# IDE,专为.NET开发设计,具有高效编码和调试功能。 ### 编写第一个应用程序 #### Welcome程序 创建第一个C#程序通常是一个简单的“Hello World”程序,这有助于熟悉C#...
它提供了统一的编程模型,能够创建跨平台、安全、可靠的网络服务。本文将深入探讨“WCFServiceSelfHosted”,即WCF服务的自承载方式,以及如何使用C#实现。 **一、什么是WCF服务自承载?** WCF服务自承载是指服务...