我在Visual Studio中通过大约3次单击就构建了世界上最笨拙,最简单的SOAP服务器。 Visual Studio 2010中的确切步骤:首先创建一个新项目作为Web应用程序,然后添加一个Web服务类型的新项目。 (有关图片,请参阅可接受的答案here。)该 SOAP 服务器服务Service1具有一个简单的GetData方法:

使用WSDL导入程序创建的clientService1.pas的一个片段...

  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客户端通信,而无需付出任何努力。但是我无法弄清楚最简单的事情。

最佳答案

一次有一次关于对话中错误的讨论,该对话很早就被大使馆职员布鲁诺·贝贝(Bruneau Babet)从Embarcadero论坛中删除了。

布鲁诺说:



您可以从以下pastebin linkbitbucket上以原始论坛格式获取修复及其说明,因此不必从周围的文本中提取文件。

沃伦更新2016:有人试图在Delphi XE上使用此修复程序,通知我该修复程序不适用于他们在Delphi XE中的功能。可以解决bitbucket中解决其余错误的代码的任何进一步更新。

10-07 19:42
查看更多