Learn WCF Service basic
WCF是使用托管代码建立和运行面向服务(Service Oriented)应用程序的统一框架。它使得开发者能够建立一个跨平台的、安全、可信赖、事务性的解决方案,且能与已有系统兼容协作。WCF是微软分布式应用程序开发的集大成者,它整合了.Net平台下所有的和分布式系统有关的技术,例如.Net Remoting、ASMX、WSE和MSMQ。
一些术语解释:
SOA:面向服务的体系结构(Service-Oriented Architecture,SOA)是一种 IT 体系结构风格,支持将业务转换为一组相互链接的服务或可重复业务任务,可在需要时通过网络访问这些服务和任务。这个网络可以是本地网络、Internet,也可以分散于各地且采用不同的技术,比如通过对来自纽约、伦敦和中国香港的服务进行组合,可让最终用户感觉似乎这些服务就安装在本地桌面上一样。可以对这些服务进行结合,以完成特定的业务任务,从而让业务快速适应不断变化的客观条件和需求。
WSE: WSE(Web Services Enhancements) 是微软提供的一个实现了WS-Security, WS-Routing, WS-Policy、WS-Addressing, WS-Attachments and DIME 等标准的组件(dll)。是对Web Service的补充与加强。它使得开发人员可以不需要深入了解上述协议的具体内容就可以开发相应的Web Services 程序,大大简化了开发难度,使得Web Services应用在企业级项目上成为可能。
.NET Remoting: 简而言之,可以将其看作是一种分布式处理方式。从微软的产品角度来看,可以说Remoting就是DCOM的一种升级,它改善了很多功能,并极好的融合到.Net平台下。Microsoft .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。它能够高性能的实现.Net与.Net之间的通信。
MSMQ:MSMQ(Microsoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。
SOAP:简单对象访问协议 (SOAP,全称为Simple Object Access Protocol) 是一种标准化的通信协议,它主要用于Web服务 (web service) 中。SOAP的出现是为了简化网络服务器 (Web Server) 在从XML数据库中提取资料时,不用花时间格式化页面,并且能够让不同的应用程序之间通过HTTP协议,以XML格式互相交换彼此的资料,使其与程序语言、平台和硬件无关。
Enterprise Service(COM+):Enterprise Services可以追溯到发布为一个Windows NT 4.0选项包的Microsoft Transaction Server (MTS) 。MTS提供了COM对象的事务处理等服务,扩展了COM。由于MTS扩展COM的方式与COM不兼容,所以从MTS应用程序中调用COM对象需要特定MTS API调用。by lirincy@163.com 林刚
Windows 2000的一个最重要的新特性是在COM+中集成了MTS和COM。在Windows 2000中,COM+基本服务支持COM+服务(以前的MTS服务)需要的环境,例如分布式事务处理。COM+也新增了一些服务。
COM+ 1.5可以在Windows XP和Windows Server 2003中使用。COM+ 1.5也新增了一些特性,以提高可伸缩性和可用性,包括应用程序池和循环,以及可配置的隔离级别。
.NET Enterprise Services可以在.NET组件中使用COM+服务,并为Windows 2000及其后续版本提供了支持。在COM+应用程序中运行.NET组件,不需要使用CCW;而是作为.NET组件运行。在操作系统上安装.NET运行库程序,会给COM+服务添加一些扩展。
WCF可以非常简单的创建一个WebService,下面我们通过一个例子来进行说明。
例子:
第一步: 添加WCF名称域:
using System.ServiceModel;
using System.ServiceModel.Description;
ServiceModel 是.NET当中用来实现WCF服务功能的名称域。
第二步: 定义服务。
[ServiceContract()]
public interface IServiceInterface
{
[OperationContract]
string sayHello( string text );
}
public class Service1 : IServiceInterface
{
public string sayHello(string text)
{
return "hello" + text;
}
}
一般来讲,将服务定义为接口,然后由它衍生出多中服务的类。这样做的一个好处是可以在接口级别定义属性,而在服务的类的级别看不到任何属性信息。只需要实现预先定义好的方法就可以。
第三步: 建立宿主,WCF的Service可以运行在程序,Windows 服务或者ASP.NET上面,我们使用Console来建立宿主:
internal class MyServiceHost
{
internal static ServiceHost mySvcHost = null;
internal static void StartService()
{
……
}
internal static void StopService()
{
……
}
}
static void Main(string[] args)
{
MyServiceHost.StartService();
Console.ReadLine();
MyServiceHost.StopService();
Console.Read();
return;
}
这里,我们定义了一个宿主 MyServiceHost,其中包含一个ServiceHost类的成员,ServiceHost类是ServiceModel当中用来创建通信对象的类。我们可以通过它来创建一个监听的对象,成为EndpointListener.
第四步:创建WCF运行时。
internal static void StartService()
{
//首先,创建一个ServiceHost对象,传入的参数是Service对象的类型和服务的地址。
Uri address = new Uri("http://localhost:8080/service1");
mySvcHost = new ServiceHost( typeof(Service1),address );
//在创建的ServiceHost对象当中查找,看是否存在ServiceMetadataBehaviour的元数据行为
//描述,如果没有找到,创建一个新的ServiceMetadataBehaviour对象。
ServiceMetadataBehavior behaviour = mySvcHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (behaviour == null)
behaviour = new ServiceMetadataBehavior();
//设置允许进行HttpGet操作。
behaviour.HttpGetEnabled = true;
//设置MetadataExporter导出Metadata时遵循WS-Policy 1.5规范。
behaviour.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
//将创建好的behaviour加入到宿主实例的行为描述组当中。
mySvcHost.Description.Behaviors.Add(behaviour);
//加入MetadataExchange endpoint.
mySvcHost.AddServiceEndpoint(
ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexHttpBinding(),
"mex"
);
//加入应用程序 endpoint
WSHttpBinding binding = new WSHttpBinding();
mySvcHost.AddServiceEndpoint(typeof(IServiceInterface), binding, address);
//打开 ServiceHost 实例。
mySvcHost.Open();
}
第五步: 测试:
在浏览器当中键入http://localhost:8080/service1, 将会看到创建的服务显示:
第六步:用应用程序客户端测试WCF服务:
在命令行中敲入svcutil http://localhost:8080/service1?wsdl,
svcutil.exe 会自动生成客户端ServiceClient对象的代码,产生两个文件service1.cs和output.config, 然后在客户端就可以使用服务客户端的类进行同WCF service的通信。
class ClientApp
{
static void Main(string[] args)
{
Service1Client client = new Service1Client();
// 使用"client" 变量在服务上调用操作。
Console.WriteLine("请输入你的名字: ");
string name = Console.ReadLine();
Console.WriteLine(client.SayHello(name));
// 始终关闭客户端。
client.Close();
Console.ReadLine();
}
}