Я построил самый мрачный и простой SOAP-сервер в мире, примерно за 3 клика, в визуальной студии. Точные шаги в Visual Studio 2010: сначала создайте новый проект как веб-приложение, затем добавьте новый элемент типа веб-службы. (См. Принятый ответ здесь для изображения.) Эта служба сервиса soap Service1 имеет простой метод GetData:
Отрывок из clientService1.pas, созданный с использованием импортера WSDL...
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-адрес работает отлично, когда я вставляю URL-адрес выше в веб-браузер, поэтому обычный ответ, что код SOAP в Delphi имеет тенденцию не замечать ошибку HTTP, не кажется вероятным. Скорее кажется, что я либо (а) испытываю разрыв в WinInet (как известно, происходит в некоторых версиях окон), либо (б) что-то не так?
Мне кажется, что любой, у кого есть визуальная студия и delphi, оба установлены, должны быть в состоянии попытаться получить пустую Starter Soap-сервер в Visual Studio, разговаривая с клиентом мыла в Delphi, без каких-либо усилий. Но я не могу понять простейшие вещи.