代码中的所有例子都可在hi.csdn.net/heroyuchao中下载
WCF
进阶篇
一、
宿主
在上一篇中我们的服务的宿主程序是一个控制台程序,同样我们也可以把服务发布在IIS上,Windows服务上,下面我就讲下如何发布在IIS上:
我继续使用上一篇中的Hello,World程序,把控制程序部分代码删除,
这是这样:
同时我们在添加一个.svc文件
![](https://p-blog.csdn.net/images/p_blog_csdn_net/heroyuchao/q未命名2.JPG)
这个文件是不是很像.asmx呀,呵呵,就是一样的。这样我们的程序就能部署在IIS上了。
一、
传递用户自定对象
我们知道用webservie传递用户定义对象必须是可以序列化的。
下面我通过一个下订单的例子讲述下如何实现WCF间的对象传递:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/heroyuchao/q未命名3.JPG)
首先我们定义了一个契约IMyService,它只有一个方法PushOrder,方法要求客户端传一个order对象,服务端根据这个order对象输出orderid,因此服务端必须对order进行一些定义,这个order我们称为数据契约即[DataContract],order中的字段orderid就是数据成员[DataMember]。配制的要求同基础篇一样。
我们再看看客户端:
客户端添加服务引用后的代理文件会比helloworld多出一个order类的定义:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/heroyuchao/q未命名4.JPG)
调用代码是这样的:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/heroyuchao/q未命名5.JPG)
运行后服务端的控制台显示如下:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/heroyuchao/q未命名6.JPG)
一、
绑定多个contract
一个服务中可以同时发布多个Contract,但是我们在配制文件中可以看到一个EndPoint中只能加上一个Contract,所以要发布多个Contract需求多个EndPoint,现在我们将上面的例子增加一个Contract。
[ServiceContract]
Public interface IOtherContract
{
[OperatorContract]
String OnTest();
}
OnTest
方法也就是返回个“hello,world”
这个接口由MyService类来实现,这样我们发布一个服务就拥有两个Contract,先来看看Config是如何写的
再看看服务端的完整代码:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/heroyuchao/q未命名9.JPG)
主函数的写法与其它例子是一样的。
客户端添加一下服务引用,就会生成代理,在代理文件中会有两个contract,客户分别定义下不同contract的对象就能访问各自contract中的方法了。
一、
一个Contract多个地址
上节的例子中是多个Contract对应多个EndPoint,同样我们也可以实现一个Contract多个Endpoint,例如我们可以发布一个Contract在内网中
使用TCP协议,在internet中使用Http协议,这样客户端就有一双向的选择,服务端没有什么改动只是多加了个EndPoint,而客户端是如何调用的呢?
我们注意下添加的代理文件:
看到了吧,一个MyServiceClient类有多个构造函数,我们用第二个MyServiceClient(string endpointConfigurtionName)就行了,其中endpointConfigurationName就是客户端配制文件中endpoint节点的名称
![](https://p-blog.csdn.net/images/p_blog_csdn_net/heroyuchao/q未命名12.JPG)
一、
服务行为
在服务端我们除了可以定义Contract以外,我们还可以对Contract进行一些行为定义。我们现在通过一个SDK文档中的例子进行讲解。
直接看代码吧:
上面的段代码定义了两个Contract,这两个Contract都是由类CalculatorService实现的,但是这个类的头上我们加了个[ServiceBehavior(InstanceContextMode=InstanceContentMode.Single)]
这就是一种服务行为,这个行为定义了服务对象是Single模式,也就是所有的客户端都将使用相同的对象访问服务方法,这就有点像Web程序中的Application对象,它是应用程序级的。InstanceContentMode还有两个值
PerCall:
如果程序设置了PerCall,也就是告诉服务端,客户端发起的每次方法调用都使用不同的服务对象。
PerSession
:看名字就知道了,它一定是与Web程序中的Session相似,是会话级,在WCF中一次会话是客户端定义一个服务访问对象到使用close方法关闭使用对象。所以如果客户端在生命期间内不关闭服务访问对象,使用的都是相同的会话通道即同一个服务器对象。
在进阶篇中我只介绍一个服务行为,在高级篇中我还会继续介绍服务行为。
后续的议题会是WCF的可靠性,分布式事务处理,回调客户端方法,脱机调用服务方法等。
待续...