Microsoft SOAP Toolkit Version 2.0 FAQ
Translate By Zee
Microsoft Corporation
August 2001
Summary: This article provides in-depth answers to frequently asked development questions regarding Microsoft SOAP Toolkit 2.0. (12 printed pages)
1.1 Soap Toolkit的最新版本是什么?
版本2.0 SP2,发布于2001年6月21日,可以在:
http://msdn.microsoft.com/downloads/default.asp?URL=/code/sample.asp?url=/msdn-files/027/001/580/msdncompositedoc.xml 下载。
1.2 我怎样使用Soap trace utility?
在服务器端使用MSSOAPT:
- 修改WSDL中 soap:address 元素的location属性,将端口改为8080。例如:假设WSDL中包含
1<http: myserver="" service.wsdl="" vdir="">,将它改为: http://MyServer:8080/VDir/Service.wsdl 。
2 * 在服务器端运行MSSOAPT。
3 * 如果你不想看到HTTP头信息的话,选择“File-> New-> Formatted Trace ”;如果你想看到HTTP头信息如ContentType 和 SoapAction,选择“File-> New-> Unformatted Trace”。
4 * 在Trace Setup对话框中点击 **OK** 以使用缺省值。
5
6
7现在对所有在WSDL中指定的地址的请求/回复消息将会显示在Trace工具里。
8
9 * 在客户端使用MSSOAPT:
10
11
12 * 在本地保存一份服务的WSDL文档副本。
13 * 修改WSDL中 **soap:address** 元素的location属性,将地址和端口改为localhost:8080 ,并记下原来WSDL的地址和端口号。例如:假设WSDL中包含<http: myserver="" service.wsdl="" vdir="">,将它改为: <http: localhost:8080="" service.wsdl="" vdir=""> 并记下"MyServer"。
14 * 在客户端运行MSSOAPT。
15 * 如果你不想看到HTTP头信息的话,选择“File-> New-> Formatted Trace ”;如果你想看到HTTP头信息如ContentType 和 SoapAction,选择“File-> New-> Unformatted Trace”。
16 * 在Trace Setup对话框中,输入在第二步中记下的地址和端口作为destination host 和destination port, 然后点击 **OK** 。
17
18
19现在所有在客户端中对指定的地址的请求/回复消息将会显示在Trace工具里。
20
21#### 1.3 为应用SSL,我需要作些什么?
22
23
24假定你的Server已经配置成需要SSL,你要做的只是修改你的WSDL文件中的URL(如果使用SOAP底层对象,就修改Soap Connector URL),把http改为https。在客户端设置 **UseSSL** 不是必须的。如果这样不行,最大的可能是Server的证书过期或者Server要求客户端证书。 要注意的是我们常常听到:“它在HTTP的情况下工作得很好,可是在HTTPS却出错。”。如果根目录被配置成要求SSL连接,它在HTTP的情况下将不会工作,因此这句话仅仅意味着你的Server没有被配置成要求SSL连接。
25一些其他常见问题:
26
27 * 请确认你的证书是有效的而且有可信任的根——双击打开证书文件,检查是否有警告。
28 * 确认你的服务器的SSL配置正确——服务器端证书有效而且有可信任的根证书,而且根证书安装在LOCAL_MACHINE存储中。
29 * 你不能把localhost作为主机名——URL中的主机名必须与服务器端证书中的机器名相同。
30 * 如果你的机器上没有安装MMC工具,要查看你的证书可以使用IE——在IE的Tools菜单,Options菜单项下的Content/Certificates/。
31 * 如果你将你的虚拟目录配置为要求客户端证书——你可以使用IE访问该虚拟目录以确定你要使用什么证书来访问该站点。IE将显示IE服务器信任的客户端证书的列表。如果你使用IE5.5,请取消IE安全性设置中的"Miscellaneous\Don't prompt for client certificates selection when no certificates or only one certificate exists"选择。
32
33
34你可以在:
35http://msdn.microsoft.com/library/default.asp?url=/library/en-us/Dnsoap/html/Soapsecurity.asp?frame=true .找到更进一步的信息。
36
37#### 1.4 为什么SMO Generator没有安装?
38
39
40是否安装SMO Generator取决于你机器注册表中是否存在"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\6.0\Setup\Microsoft
41Visual Basic\ProductDir"的键值,你可以检查注册表确认是否存在该键值。
42(注:SMO Generator=SOAP Messageing Object Generator ,是一个VB6 AddIn,其实就是说要安装了VB6才会安装SMO Generator。)
43
44#### 1.6 我怎样使Soap Toolkit可以与Apache交互?
45
46
47在版本2.1以前, Apache 要求所有的SOAP参数都要带有xsi:type属性 。同时, Soap Toolkit 通常不会在SOAP Message中发送xsi:type。在Apache version 2.1中,如果类型已经在配置描述符(注:deployment descriptors,不知何义。)定义过,则可以不需要再指定xsi:type 属性。然而, Apache服务还没有使用WSDL,因此,为了使SOAP Toolkit客户能够与Apache server交互,必须再为他创建一个WSDL文件。Soap Toolkit RTM版经测试可以成功的与Apache 2.2交互。
48另一个小窍门是你可以手工修改生成的WSDL文件,把Apache难以处理的类型修改为"xsd:anyType"。这将使Toolkit认为这个参数是variant类型,于是它会包含参数的类型信息,而这正是Apache需要的。
49
50#### 1.9 WSDL是什么?
51
52
53WSDL是一个标准,是一种结构化的描述SOAP消息和Web服务的方法。Soap Toolkit依据WSDL创建和解释SOAP消息 ,因此,SOAP Toolkit 2.0的客户端和服务端都需要WSDL文档。如果你希望Soap Toolkit 2.0 客户端与一个不支持WSDL的SOAP 服务器交互,你必须自己创建一个WSDL文档描述SOAP 服务器需要的SOAP 消息格式。我发现创建这个WSDL最简单的办法是用VB创建一个哑接口,这个接口定义的方法和SOAP服务器的相同,然后,使用WSDLGen生成这个VB dll的WSDL文件。你当然也可以自己写WSDL文档。如果你希望用一个不支持WSDL的SOAP 客户访问SOAP Toolkit 2.0 服务,你可以把WSDL作为SOAP Message格式的描述,并把它作为Client端创建SOAP Message的依据。
54
55#### 1.10 在哪里可以找到WSDL标准?
56
57
58W3C已经接受了WSDL 1.1 规范,你可以在 http://www.w3.org/TR/wsdl 找到相应的标准。
59
60#### 1.11 当我在ASP里运行我的SOAP客户端时,为什么我不能读到WSDL文档?
61
62
63WSDL Reader 使用MSXML的http接口将WSDL Load到DOM。在ASP中运行MSXML HTTP stack 需要设置ServerHTTPRequest选项。为此,需要这样调用:
64
65 1. 设置"ServerHTTPRequest" 属性为true。例:
66SoapClient.ClientProperty("ServerHTTPRequest") = True
67 2. 需要运行proxycfg.exe (见 Knowledge Base article Q289481 )。
68
69
70另一个办法是使用本地的WSDL文件:
71mssoapinit ("C:\wsldfiles\MyProject.wsdl")
72
73#### 1.11 WSML是什么?
74
75
76WSML可以认为是SOAP Toolkit的配置文档。它包含将WSDL中描述的SOAP消息映射到COM接口的信息。比如COM的一些信息如ProgID和DispID。 WSML不会成为标准,因为它仅仅对Soap Toolkit才有意义。
77
78#### 1.12 我为什么要使用SMO而不是SOAP Toolkit的高层对象接口?
79
80
81虽然这二者的功能有一定的重合,但各有侧重:SOAP Toolkit的高层对象一般最好用于传统的程序间RPC调用。而SMO比较适用于面向消息的应用。如果你希望用SOAP交换XML文档,SMO是最佳的选择。如果你希望用SOAP在远程机器上执行某些操作,高层对象接口可能会是更好一些的选择。SMO提供了一个接口, 可以比高层对象接口更容易地创建复杂的XML 文档。
82
83#### 1.13 什么时候我才需要使用ISAPI listener而不是ASP?
84
85
86我的回答是几乎所有的时候。ISAPI 比ASP更快而且更容易使用,所以除非你要做一些ISAPI不能做的事或者你使用SMO,建议你使用ISAPI。
87
88#### 1.14 为什么ISAPI不能在我的虚拟目录运行?
89
90
91当ISAPI安装后,它会把自己注册为".WSDL" 的处理者。Soap Toolkit 2.0会在IIS服务层的"App Mapping" 中创建".WSDL"扩展名和soapisap.dll的关联。如果"App Mappings"在IIS Web Service的下级结点中被改变过(例如在"Web Site"或者"Virtual Directory"层),由于它们的优先级高于Soap Toolkit 2.0的安装设置, IIS服务层的".WSDL"的映射不会在这些结点中被继承。在这种情况下,你可以用MMC管理工具在"App Mappings"中添加相应的映射。
92下面举例说明在IIS 5.0的"Default Web Site"中使用MMC管理工具添加"App Mappings" 的步骤(请确定你有本地管理权限。):
93
94 1. 在"Default Web Site"的属性页中选择 **Home Directory** 页。
95 2. 在 **Home Directory** 页,点击 **Configuration** 按钮 在出现的"Application Configuation"对话框中选择 **App Mappings** 页。
96 3. 如果.wsdl扩展不存在,点击 **Add** 按钮加入.wsdl扩展。
97 4. 输入soapisap.dll的路径.。
98
99
100**注** 由于IIS管理工具存在Bug,不能输入包含空格的文件路径。你可能需要输入指向soapisap.dll 的8.3格式的文件路径。
101(如: C:\PROGRA~1\COMMON~1\MSSOAP\BINARIES\SOAPISAP.DLL)
102在"Extension"文本框中输入.wsdl。如果使用Microsoft® Windows® 2000,在"Verbs"中选择 **Limit to** 并输入: GET, POST, HEAD。 **如果使用** **Windows NT** ** ® 4 ** **,则不要填写Exclude** **文本框。** 选中"Script Engine"并不选"Check that files exist"。最后,点击 **OK** 完成新映射的输入。
103**注** 虽然上述步骤用于设置"Default Web Site"的"App Mappings" ,对"Virtual Directory"的设置也是这样的。
104
105#### 1.15 Soap Toolkit是否支持数组?
106
107
108SOAP Toolkit支持一维简单类型数组、复杂类型数组和多维数组。在下一个Service Pack中将进一步加强对数组类型的支持。
109
110#### 1.19 Soap Toolkit 的fault Detail 元素中包含了什么信息?
111
112
113SOAP中的detail 部分是名称空间限定的,它使用下面的名称空间:
114http://schemas.microsoft.com/soap-toolkit/faultdetail/error/
115所有的Soap Toolkit错误信息都具有如下的格式:
116<soap:fault....>
117<detail>
118<mserror:errorinfo xmlns:mserror="http://schemas.microsoft.com/soap-
119toolkit/faultdetail/error/">
120<mserror:returncode></mserror:returncode>
121<mserror:servererrorinfo>
122<mserror:description></mserror:description>
123<mserror:source></mserror:source>
124<mserror:helpfile></mserror:helpfile>
125<mserror:helpcontext></mserror:helpcontext>
126</mserror:servererrorinfo>
127<mserror:callstack>
128<mserror:callelement>
129<mserror:component></mserror:component>
130<mserror:description></mserror:description>
131<mserror:returncode></mserror:returncode>
132</mserror:callelement>
133</mserror:callstack>
134</mserror:errorinfo>
135</detail>
136因此,假定我们需要产生详细的错误信息,我们要创建扩展的 **errorinfo** 段:段中的根元素是 **mserror:errorInfo** 元素,它的第一个子元素是 **returnCode** ,其中包含HRESULT错误编码。
137如果服务器上发生的错误同时也包括一个 **errorinfo** 对象(原文:If the failure was caused by something providing an **errorinfo** object itself on the server,翻译存疑)(如: **servercomponent** 已被调用错误(?)), 这时 (也仅在这时,因此下面的步骤不总是需要的。)我们要创建 **mserror:serverErrorInfo** 段。该段中的所有部分都是可选的。——虽然当存在一个帮助文件时你总是可以得到 **helpContext** **元素** ——段中的元素仅当服务器存在该信息时才会出现。如果存在这些信息,它们会在客户端的 **Error** 对象的相应属性中出现。
138
139#### 1.20 为什么我会得到"library not registered"错误?
140
141
142
143"library not registered"错误可能会在试图执行: Server.CreateObject("MSSOAP.SoapServer")时出现。
144该错误的产生原因是SOAP类型库的注册表项没有赋予"Everyone"组读的权限。产生该错误的最可能的原因是安装过Crystal Reports 8.0。
145(见 http://support.microsoft.com/support/kb/articles/Q266/6/21.ASP )
146
147
148\-----------------------------------------
149第一次翻译 :)
150Part 2 under work</soap:fault....></http:></http:></http:>