[WSE]Web Service—后台侦听服务通过WSE2.0建立订阅/发布关系

编写者:郑昀 @UltraPower 日期: 2005-04-13

由于 Web Service 的执行身份受限,所以我们无法直接让 Web Service 申请作为一个 SoapReceiver ,而是通过下面的 web.config 定义来制定本虚拟目录的 .ashx 终结点,从而通过 ** WS_Addressing ** 和 ** WS_Messaging ** 机制来完成与 后台侦听服务 之间的订阅 / 发布机制。

 1<configuration>
 2<configsections>
 3<section name="microsoft.web.services" type="Microsoft.Web.Services.Configuration.WebServicesConfiguration, 
 4
 5Microsoft.Web.Services, Version=  2.0.0.0, Culture=neutral, 
 6
 7PublicKeyToken=31bf3856ad364e35"></section>
 8</configsections>
 9
10** 原理介绍:  **
11
12除了进程内与  TCP  通讯机制,还可以在  ASP.NET  中将  SoapReceivers  与  HTTP  管道进行集成。如果查看一下  SoapReceiver  的定义,您会注意到它实现了  IhttpHandler  : 
13
14public abstract class SoapReceiver : SoapPort, IHttpHandler 
15
16{ 
17
18。。。 
19
20} 
21
22由于这一点,任何  SoapReceiver  或  SendService  类现在都能够在  ASP.NET  中配置为  HTTP  处理程序。通过在  web.config  文件的  httpHandlers  部分添加一个新的映射,用户能够配置  http  处理程序。  web.config  项将把  verb/path  组合映射到  SoapReceiver  类型: 
23
24&lt; system.web  &gt;
25
26&lt; httpHandlers  &gt;
27
28<!--  \--  为了让我们的  WebService  能够接收到来自于后台侦听服务的  SOAP  消息 
29
30我们让  WebService  继承自  SoapReceiver  ,并实现了  void Receive(SoapEnvelope envelope)  , 
31
32这样  DLL  通过向 
33
34new Uri("http://"+ System.Net.Dns.GetHostName() + "/MyService/GetReceiver.ashx") 
35
36发送  SOAP  消息,那么  SoapReceiver  的  Receive  回调函数将被调用 
37
38\--  -->
39
40&lt; add  type  ="MyWebService.MyInterface"  path  ="GetReceiver.ashx"  verb  ="*"  /&gt;
41
42
43
44把这组代码放到适当的位置,将针对每条输入此虚拟目录并指向  GetReceiver.ashx  的消息而调用  MyService  。现在我们不必担心通过调用  SoapReceiver.Add  来配置  SoapReceiver  /  SoapService  ,因为  ASP.NET  本质上代替您完成了此任务。 
45
46如果更新客户端以把消息发送到  HTTP  终结点  (http://localhost/MyService/GetReceiver.ashx)  ,它会与使用  TCP  的工作方式相同,只是现在它通过  HTTP  进行通讯。 
47
48##  Web Service—  后台侦听服务订阅关系 
49
50由于  Web Service  运行的身份是  ASP.NET  用户,而  SoapReceiver.Add  方法对执行权限要求较高,所以我们采用  HTTP  终结点的方式,再加上几个静态的哈希表,从而完成了与后台侦听服务之间的异步交互,以及与客户端调用者之间的异步交互。 
51
52下面我们具体讲解一下: 
53
54首先,调用者请求  Web Serviced  的  BeginXXX  方法,这个方法再异步调用  ProcessXXX  方法它负责组装出一个  ** SoapEnvelope  ** ,并向  Uri  为 
55
56soap.tcp://hostname:port/yourreceivername 
57
58的目标  EndPoint  ,用  SoapSender.Send  发送这个  ** SoapEnvelope  ** 。一方面用于通知订阅关系,另一方面传递了各项参数,以及预先生成的  GUID  。之后就将处理权返回调用者。 
59
60这里包含了图中的  1  ,  2  ,  3  三步: 
61
62其次,正在监听的侦听服务收到了消息,进行处理: 
63
64添加这个订阅者的各种信息到静态哈希表; 
65
66利用  I/O  完成端口异步执行各种任务; 
67
68把结果集或者错误信息通过  Web Service HTTP  终结点通知订阅者。 
69
70这里包含了图中的  4  ,  5  ,  6  三步: 
71
72最后,订阅者  Web Service  收到通知后,通知客户端调用者的回调函数来取回结果集,从而将结果集或者错误原因返回给客户端。 
73
74编写者:郑昀  @UltraPower</configuration>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus