Windows通讯基础编程之基础知识
Windows通讯基础(WCF)--即我们原来知道的Indigo--是微软用于Windows的新的连接(connected)系统平台。本文介绍了一些基本的原理,建立了一个简单的应用程序。
WCF是一种不断增强的和进化的技术,它把以前所有独特和分散的微软连接技术合并到了单一的System.ServiceModel名称空间之中。WCF中所包含了Web服务(ASMX)、Web服务扩展(WS*)、微软消息队列(MSMQ)、企业级服务、COM+和.NET Remoting。
让一个名称空间包含所有这些内容是非常有益的,它使我们设计、开发和部署需要连接的应用程序大大地简化了。有了WCF之后,你不需要在大量不同的名称空间的实现之间进行选择,也不需要编写类型来建立连接的应用程序。无论你的应用程序是通过松散耦合的Web服务连接,还是通过紧密耦合的企业级服务来连接,编写代码的模型都是一致的,不同的信息类型之间的转换变得平缓很多--因为它们都使用了同一个编程名称空间。
使用WCF
WCF遵循"软件即服务"模型,也就是所有的功能单元都被定义为服务。开发者不需要关心通讯(communications)是如何工作的,而只需要关心服务的位置、服务之间如何对话以及如何描述这些内容。因此,对于任何服务来说,你都必须知道下面三个问题的答案:
1.服务的地址。服务在哪儿?它在互联网上、自己的网络中的某台计算机上、还是在自己使用的计算机上?
2.服务的绑定。如何与它对话?我是使用SOAP还是MSMQ?
3.服务的规范(Contract)。它能为我做什么事情?我应该给它传递什么类型的数据?它返回什么样的数据?
如果你对Web服务非常熟悉,或许你已经理解了WSDL术语中的这三个方面的内容。WCF采用了这种定义服务工作方式的流行和成功的方法,并对它进行了扩展,使它能够与其它形式的通讯(微软消息队列、企业级服务、COM+和.NET Remoting)一起工作。
第一个WCF应用程序:建立服务
如果你现在还不太熟悉WCF的一些术语,例如绑定、规范、寻址(addressing)等等,也不要担心;这类术语最好从示例中学习。在本文后面的部分中,你将建立自己的第一个Indigo应用程序。为了建立这个应用程序,你必须遵循一定的步骤。
开始之前,在硬盘上建立一个物理目录(C:\tconvert)以存放应用程序,并把这个目录映射为IIS虚拟目录(叫做Temperatures)。如果你使用的是Windows Server 2003,那么请确保ASPNET进程能够访问这个目录。
第一步是建立一个Windows通讯基础服务规范。它基本上是一个被标记的接口,表明自己是一个服务规范。详见列表1。
列表1:WCF服务规范。它显示了温度转换服务示例的服务规范。
请注意上面属性的标记。ServiceContract()属性表明ITemperatures接口将成为WCF中的一个服务规范,OperationContract()表明ftoc和ctof将被定义为该规范中的操作符(operation)。因此,该过程是很简单的。
第二步是在它上面进行扩展,建立用于实现列表1中定义的接口的代码。下面的代码建立了Service类。
你可以使用下面的命令来编译这段代码,即在命令提示符下输入下面一行内容。你必须给.NET框架组件设置PATH(路径)信息。
csc /r:System.ServiceModel.dll
/out:TemperatureService.dll /t:library
TemperatureService.cs
在tconvert目录下建立BIN子目录,并把上面生成的DLL文件复制到该目录中。
下一步,配置web.config文件(见列表2)。web.config包含了WCF处理各项事务需要的所有信息。仔细查阅这个文件是很有帮助意义的。请注意,这个文件的语法在每个版本中都好像有很大的改变,甚至于在微软的在线文档和供下载的文档中也有所不同。
列表2:TemperatureService的 Web.Config文件。这个文件定义了TemperatureService的服务、行为和绑定。
在编写WCF应用程序的时候,理解列表2所示的web.config文件对我们很有用处,特别是在你没有使用Visual Studio .NET的情况下。<system.ServiceModel>标记保存着WCF服务的全部信息。
服务、行为和绑定
使用WCF的时候,你必须在web.config中配置三种信息:服务、行为和绑定。
服务
服务的设置中有两个部分非常重要:首先是行为的位置,其次是服务的类型。它在自己的名称空间中定义,在例子中就是Devx.Indigo.Samples.TemperatureService。
行为
Behaviors元素使你能够设置服务在特定环境中应该做出的反应(操作)。它需要configurationName属性,这样服务就可以映射它。在列表2中,服务被配置为:遇到错误(fault)的时候就返回任意的未知异常(exception)。
绑定
在bindings元素中定义绑定和绑定类型。在例子中,这个元素很简单,被指定为HTTP类型绑定,其标识为Binding1。你可以查看MSDN文档和大纲(在这个配置文件的最上面定义的)以获取更多的信息。
最后的事务是建立服务转换器(service mapper)。请在tconvert目录中建立一个文本文件,取名为"service.svc"。它应该包含下面一行代码:
<@Service language=c# Debug="true"
class="Devx.Indigo.Samples.TemperatureService" %>
该Indigo服务已经建好了。你可以通过URL(http:///TemperatureService/service.svc)来访问它。你会看到图1所示的结果。
第一个Indigo应用程序:建立客户端
Windows通讯基础SDK提供了一个叫做svcutil.exe的工具,它为你的客户端建立代理(proxy)代码。对于这个服务,请在命令提示符下提交下面的命令(可能需要根据你的服务器设置做一些修改):
svcutil /language:C# /config:app.config
http://192.168.0.1/Temperatures/service.svc?wsdl
由于我们没有指定该服务的名称空间,.NET生成的WSDL就使用了tempuri.org Web名称空间这个默认值。请不要把这个名作空间与代码(Java中称为程序包)的名称空间混淆了(在代码中的名称空间是Devx.Indigo.Samples)。同样,svcutil生成的代码叫做tempuri.org.cs,它是你的代理类。
你可以在应用程序类中用如下所示的方式来使用这个代理类:
你可以使用下面的命令把上述的类编译为一个可执行应用程序:
Csc /r:System.ServiceModel.dll /t:exe
TemperatureClient.cs tempuri.org.cs
当你执行应用程序的时候,它调用Indigo服务,执行华氏温度到摄氏温度(FtoC)和摄氏温度到华氏温度(CtoF)的转换并返回结果。
Windows通讯基础是一个非常强大和灵活的技术,在未来它会称为开发者的工具箱中一个重要的部分。它解决了两个主要的问题:多种多样的通讯框架组件和增长的标准。它对于所有的建立在知名的、行业接受的标准之上的通讯类型来说都是"一站购物"的,同时它是使用大多数Visual Studio.NET开发者已经熟悉的范例(paradigm)来实现这些事务的。在我们开始使用它的时候,可能感觉到难以掌握某些术语(例如绑定、规范等)的意义,但是有了一点经验或做了少量的工作之后,这些概念就很自然了。
本文所讨论的WCF应用程序是一个非常简单的服务器/客户端程序,它使用了ServiceModel框架组件进行通讯。虽然它所执行的事务没有超出通用的Web服务的范围,但是它却使你能够感受到WCF带来的优势。
WCF是一种不断增强的和进化的技术,它把以前所有独特和分散的微软连接技术合并到了单一的System.ServiceModel名称空间之中。WCF中所包含了Web服务(ASMX)、Web服务扩展(WS*)、微软消息队列(MSMQ)、企业级服务、COM+和.NET Remoting。
让一个名称空间包含所有这些内容是非常有益的,它使我们设计、开发和部署需要连接的应用程序大大地简化了。有了WCF之后,你不需要在大量不同的名称空间的实现之间进行选择,也不需要编写类型来建立连接的应用程序。无论你的应用程序是通过松散耦合的Web服务连接,还是通过紧密耦合的企业级服务来连接,编写代码的模型都是一致的,不同的信息类型之间的转换变得平缓很多--因为它们都使用了同一个编程名称空间。
使用WCF
WCF遵循"软件即服务"模型,也就是所有的功能单元都被定义为服务。开发者不需要关心通讯(communications)是如何工作的,而只需要关心服务的位置、服务之间如何对话以及如何描述这些内容。因此,对于任何服务来说,你都必须知道下面三个问题的答案:
1.服务的地址。服务在哪儿?它在互联网上、自己的网络中的某台计算机上、还是在自己使用的计算机上?
2.服务的绑定。如何与它对话?我是使用SOAP还是MSMQ?
3.服务的规范(Contract)。它能为我做什么事情?我应该给它传递什么类型的数据?它返回什么样的数据?
如果你对Web服务非常熟悉,或许你已经理解了WSDL术语中的这三个方面的内容。WCF采用了这种定义服务工作方式的流行和成功的方法,并对它进行了扩展,使它能够与其它形式的通讯(微软消息队列、企业级服务、COM+和.NET Remoting)一起工作。
第一个WCF应用程序:建立服务
如果你现在还不太熟悉WCF的一些术语,例如绑定、规范、寻址(addressing)等等,也不要担心;这类术语最好从示例中学习。在本文后面的部分中,你将建立自己的第一个Indigo应用程序。为了建立这个应用程序,你必须遵循一定的步骤。
开始之前,在硬盘上建立一个物理目录(C:\tconvert)以存放应用程序,并把这个目录映射为IIS虚拟目录(叫做Temperatures)。如果你使用的是Windows Server 2003,那么请确保ASPNET进程能够访问这个目录。
第一步是建立一个Windows通讯基础服务规范。它基本上是一个被标记的接口,表明自己是一个服务规范。详见列表1。
列表1:WCF服务规范。它显示了温度转换服务示例的服务规范。
namespace Devx.Indigo.Samples { using System; using System.ServiceModel; [ServiceContract()] public interface ITemperatures { [OperationContract] double ftoc(double n1); [OperationContract] double ctof(double n1); } } |
请注意上面属性的标记。ServiceContract()属性表明ITemperatures接口将成为WCF中的一个服务规范,OperationContract()表明ftoc和ctof将被定义为该规范中的操作符(operation)。因此,该过程是很简单的。
第二步是在它上面进行扩展,建立用于实现列表1中定义的接口的代码。下面的代码建立了Service类。
using System; using System.ServiceModel; namespace Devx.Indigo.Samples { [ServiceContract()] public interface ITemperatures { [OperationContract] double ftoc(double n1); [OperationContract] double ctof(double n1); } public class TemperatureService : ITemperatures { public double ftoc(double f) { double dReturn = 0.0; dReturn = ((f - 32) * 5) / 9; return dReturn; } public double ctof(double c) { double dReturn = 0.0; dReturn = ((c + 32) * 9) / 5; return dReturn; } } } |
你可以使用下面的命令来编译这段代码,即在命令提示符下输入下面一行内容。你必须给.NET框架组件设置PATH(路径)信息。
csc /r:System.ServiceModel.dll
/out:TemperatureService.dll /t:library
TemperatureService.cs
在tconvert目录下建立BIN子目录,并把上面生成的DLL文件复制到该目录中。
下一步,配置web.config文件(见列表2)。web.config包含了WCF处理各项事务需要的所有信息。仔细查阅这个文件是很有帮助意义的。请注意,这个文件的语法在每个版本中都好像有很大的改变,甚至于在微软的在线文档和供下载的文档中也有所不同。
列表2:TemperatureService的 Web.Config文件。这个文件定义了TemperatureService的服务、行为和绑定。
<?xml version="1.0" encoding="utf-8" ?> <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <system.serviceModel> <services> <service behaviorConfiguration="TemperatureServiceBehavior" type="Devx.Indigo.Samples.TemperatureService" > <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1" contract="Devx.Indigo.Samples.ITemperatures" /> </service> </services> <behaviors> <behavior configurationName="TemperatureServiceBehavior" returnUnknownExceptionsAsFaults="True"> </behavior> </behaviors> <bindings> <wsHttpBinding> <binding configurationName="Binding1" /> </wsHttpBinding> </bindings> </system.serviceModel> <system.web> <compilation debug="true" /> </system.web> </configuration> |
在编写WCF应用程序的时候,理解列表2所示的web.config文件对我们很有用处,特别是在你没有使用Visual Studio .NET的情况下。<system.ServiceModel>标记保存着WCF服务的全部信息。
服务、行为和绑定
使用WCF的时候,你必须在web.config中配置三种信息:服务、行为和绑定。
服务
服务的设置中有两个部分非常重要:首先是行为的位置,其次是服务的类型。它在自己的名称空间中定义,在例子中就是Devx.Indigo.Samples.TemperatureService。
行为
Behaviors元素使你能够设置服务在特定环境中应该做出的反应(操作)。它需要configurationName属性,这样服务就可以映射它。在列表2中,服务被配置为:遇到错误(fault)的时候就返回任意的未知异常(exception)。
绑定
在bindings元素中定义绑定和绑定类型。在例子中,这个元素很简单,被指定为HTTP类型绑定,其标识为Binding1。你可以查看MSDN文档和大纲(在这个配置文件的最上面定义的)以获取更多的信息。
最后的事务是建立服务转换器(service mapper)。请在tconvert目录中建立一个文本文件,取名为"service.svc"。它应该包含下面一行代码:
<@Service language=c# Debug="true"
class="Devx.Indigo.Samples.TemperatureService" %>
该Indigo服务已经建好了。你可以通过URL(http:///TemperatureService/service.svc)来访问它。你会看到图1所示的结果。
|
图1:运行中的WCF服务:在建立服务之后,当你从浏览器来访问它的时候,会看到与此类似的一个窗口,它显示了如何使用服务。 |
第一个Indigo应用程序:建立客户端
Windows通讯基础SDK提供了一个叫做svcutil.exe的工具,它为你的客户端建立代理(proxy)代码。对于这个服务,请在命令提示符下提交下面的命令(可能需要根据你的服务器设置做一些修改):
svcutil /language:C# /config:app.config
http://192.168.0.1/Temperatures/service.svc?wsdl
由于我们没有指定该服务的名称空间,.NET生成的WSDL就使用了tempuri.org Web名称空间这个默认值。请不要把这个名作空间与代码(Java中称为程序包)的名称空间混淆了(在代码中的名称空间是Devx.Indigo.Samples)。同样,svcutil生成的代码叫做tempuri.org.cs,它是你的代理类。
你可以在应用程序类中用如下所示的方式来使用这个代理类:
using System; using System.ServiceModel; namespace Devx.Indigo.Samples { class TemperatureClient { static void Main() { using (TemperaturesProxy proxy = new TemperaturesProxy("default")) { double c = 0.0; double f = 0.0; c = 22.2; f = proxy.ctof(c); Console.WriteLine("{0} degrees C = {1} degrees F", c, f); f = 93.7; c = proxy.ftoc(f); Console.WriteLine("{0} degrees C = {1} degrees F", c, f); proxy.Close(); } Console.WriteLine(); Console.WriteLine("Press <ENTER> to terminate client."); Console.ReadLine(); } } } |
你可以使用下面的命令把上述的类编译为一个可执行应用程序:
Csc /r:System.ServiceModel.dll /t:exe
TemperatureClient.cs tempuri.org.cs
当你执行应用程序的时候,它调用Indigo服务,执行华氏温度到摄氏温度(FtoC)和摄氏温度到华氏温度(CtoF)的转换并返回结果。
Windows通讯基础是一个非常强大和灵活的技术,在未来它会称为开发者的工具箱中一个重要的部分。它解决了两个主要的问题:多种多样的通讯框架组件和增长的标准。它对于所有的建立在知名的、行业接受的标准之上的通讯类型来说都是"一站购物"的,同时它是使用大多数Visual Studio.NET开发者已经熟悉的范例(paradigm)来实现这些事务的。在我们开始使用它的时候,可能感觉到难以掌握某些术语(例如绑定、规范等)的意义,但是有了一点经验或做了少量的工作之后,这些概念就很自然了。
本文所讨论的WCF应用程序是一个非常简单的服务器/客户端程序,它使用了ServiceModel框架组件进行通讯。虽然它所执行的事务没有超出通用的Web服务的范围,但是它却使你能够感受到WCF带来的优势。
http://www.jphgd.com.cn/
http://www.jphgd.com.cn/chandizheng/
http://www.jphgd.com.cn/jiaqian/
http://www.jphgd.com.cn/about.html
http://www.jphgd.com.cn/news/
http://www.jphgd.com.cn/chandizheng/
http://www.jphgd.com.cn/jiaqian/
http://www.jphgd.com.cn/about.html
http://www.jphgd.com.cn/news/