Я создал самый тупой и простой в мире SOAP-сервер, примерно за 3 клика, в visual studio. Точные шаги в visual studio 2010: Сначала создайте новый проект как веб-приложение, затем добавьте новый элемент типа веб-сервис. (См. принятый ответ здесь для иллюстрации.) Эта служба мыльного сервера 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 (известной в некоторых версиях windows), либо (б) делаю что-то неправильно?
Мне кажется, что любой, у кого установлены и visual studio, и delphi, должен быть в состоянии попытаться заставить фиктивный стартовый Soap-сервер в Visual Studio общаться с soap-клиентом в Delphi без каких-либо усилий. Но я не могу разобраться с простейшими вещами.