编写者:郑昀 @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< system.web >
25
26< httpHandlers >
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< add type ="MyWebService.MyInterface" path ="GetReceiver.ashx" verb ="*" />
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>