Delphi 中的 SOAP 客户端“句柄对于所请求的操作处于错误状态”
我在 Visual Studio 中只需单击 3 次,就构建了世界上最愚蠢、最简单的 SOAP 服务器。 Visual Studio 2010 中的具体步骤: 首先创建一个新项目作为 Web 应用程序,然后添加一个类型为 Web 服务的新项目。 (参见接受的答案此处 查看图片。)soap 服务器服务 Service1 有一个简单的方法 GetData:
来自 clientService1.pas 的片段,使用 WSDL 创建importer...
IService1 = interface(IInvokable)
['{967498E8-4F67-AAA5-A38F-F74D8C7E346A}']
function GetData(const value: Integer): string; stdcall;
function GetDataUsingDataContract(const composite: CompositeType2): CompositeType2; stdcall;
end;
当我尝试运行此方法时,如下所示:
procedure TForm3.Button1Click(Sender: TObject);
var
rio : THTTPRIO;
sv:IService1;
addr : string;
data : string;
begin
//addr := '....'; // url from visual studio 2010 live debug instance.
rio := THTTPRIO.Create(nil);
sv := GetIService1( true, addr, rio );
try
data := sv.GetData( 0);
Button1.Caption := data;
finally
sv := nil;
rio.Free;
end;
end;
我得到的错误是这样的:
ESOAPHTTPException:
The handle is in the wrong state for the requested operation -
URL:http://localhost:8732/Design_Time_Addresses/WcfServiceLibrary1/Service1/ -
SOAPAction:http://tempuri.org/IService1/GetData'.
当我将上面的 url 粘贴到 Web 浏览器中时,URL 工作正常,因此通常的答案是 Delphi 中的 SOAP 代码有这样的趋势不注意到 HTTP 故障似乎不太可能。相反,我似乎要么 (a) 在 WinInet 中遇到损坏(已知在某些版本的 Windows 中发生),要么 (b) 做错了什么?
在我看来,任何同时安装了 Visual Studio 和 Delphi 的人都应该能够尝试让 Visual Studio 中的虚拟启动 Soap 服务器与 Delphi 中的 Soap 客户端进行通信,而无需任何努力。但我无法弄清楚最简单的事情。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
有一次,内河码头工作人员布鲁诺·巴贝特 (Bruneau Babet) 就一段对话中的错误进行了讨论,该对话现已从内河码头论坛中删除。
布鲁诺说:
您可以从以下 pastebin 链接 获取修复及其原始论坛格式的注释bitbucket 因此您不必提取文件从周围的文字。
Warren 更新 2016: 有人试图在 Delphi XE 上使用此修复程序,但我已被告知此修复程序在 Delphi XE 中对他们不起作用。如果对 bitbucket 中的代码进行任何进一步更新以解决剩余的错误,我们将不胜感激。
At one time there was a discussion about the error in a conversation now long since deleted from Embarcadero forums, by Bruneau Babet, an embarcadero staffer.
Bruno said:
You can get the repair and the notes about it in its original forum formatting from the following pastebin link and on bitbucket so you don't have to extract the file from the surrounding text.
Warren Update 2016: I have been informed by someone who tried to use the fix on Delphi XE that this fix does NOT work for them in Delphi XE. Any further updates to the code in bitbucket that resolve the remaining bugs would be appreciated.
我在 2018 年 11 月使用 Delphi Tokyo 10.2.3 遇到了 The handle is in the error state for the requested operation 问题,然后查看了 href="https://stackoverflow.com/a/8195082/512728">Arjen 的回答。
该代码非常旧,测试代码不再有效(SOAP 服务不可用)。此外,从 Bruneau 的代码中还不清楚他到底修补了什么。
比较该源代码和我的 Delphi 版本中的源代码,似乎这些是
HandleWinInetError
过程中所需的(两个)修改(“PATCH HERE”):请注意,RaiseError在此补丁之前甚至没有使用 procedure 参数;-)
这是一些使用 NOAA 的 SOAP 服务的测试代码 国家数字预报数据库 (NDFD) SOAP Web 服务:
没有 URL 尾部的补丁错误会被捕获,但域名中的错误只会触发空错误消息。
补丁也可以捕获这些内容。
我已在 RAD Studio 质量门户中报告了该问题,编号为 RSP-21862
使用您需自行承担风险,并请报告任何其他发现。
补充:该问题已于 2018 年 12 月在 Delphi 10.3 Rio 中得到修复,质量门户问题已结束,并附有以下评论:
我还没有验证这一点。
I ran into the The handle is in the wrong state for the requested operation issue in November 2018 using Delphi Tokyo 10.2.3, then looked at the code patch in the pastebin link under Arjen's answer.
That code is very old and the test code no longer works (SOAP service unavailable). Also, it is unclear from Bruneau's code what he patched exactly.
Comparing that source and the one from my Delphi version it seems that these are the (two) required modifications in the
HandleWinInetError
procedure ('PATCH HERE'):Note that the RaiseError procedure parameter was not even used before this patch ;-)
Here is some test code using the SOAP service from NOAA's National Digital Forecast Database (NDFD) SOAP Web Service:
Without the patch errors in the tail end of the URL are caught, but errors in the domain name just trigger an empty error message.
With the patch those are also caught.
I have a reported the issue in the RAD Studio Quality Portal under number RSP-21862
Use at your own risk and please report any additional findings.
Addition: The issue was fixed in Dec 2018 in Delphi 10.3 Rio and the Quality Portal issue was closed with the following remark:
I have not verified this.