Клиент SOAP в Delphi "Ручка находится в неправильном состоянии для запрошенной операции"

Я построил самый мрачный и простой 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, без каких-либо усилий. Но я не могу понять простейшие вещи.

Ответ 1

Когда-то была дискуссия об ошибке в разговоре, который давно удалился с форумов Embarcadero, Бруне Бабе, штаба embarcadero.

Бруно сказал:

Здравствуйте,

Я опубликовал исправленную версию SOAPHTTPTrans.pas, которая содержит исправление для этой проблемы:

[ссылка форума отредактирована, в любом случае она больше не работает, почта ушла]

Вы все еще можете переопределить событие, как описано в разделе С++ Builder; или, что гораздо проще, по крайней мере для пользователей Delphi, просто добавьте обновленный SOAPHTTPTrans.pas в проект приложения. Сообщите нам, если это не сработает для вас.

Ура,

Брюно

Вы можете получить ремонт и примечания об этом в своем оригинальном форматировании форума со следующей ссылки pastebin и на битбакете, чтобы вам не пришлось извлекать файл из окружающего текста.

Warren Update 2016: мне сообщили кто-то, кто попытался использовать исправление в Delphi XE, что это исправление НЕ работает для них в Delphi XE. Любые дальнейшие обновления кода в битбакете, которые разрешают оставшиеся ошибки, будут оценены.