Delphi XE2 HTTPRIO Невозможно получить конечную точку URL для службы / порта - PullRequest
7 голосов
/ 23 января 2012

Я преобразую программу Delphi 2007 в Delphi XE2 и у меня возникла проблема со следующим сообщением об ошибке:

Невозможно получить конечную точку URL для службы / порта "/" из WSDL 'http://.....'

Служба, к которой я подключаюсь, написана на Delphi 2007.

В 2007 году она компилируется и работает без проблем.На XE2 с тем же кодом он падает с ошибкой.

Я попытался повторно импортировать интерфейс, используя новый импортер WSDL с установленными значениями по умолчанию, но без радости.

Я также попытался установитьИмена портов и служб, а ошибка не устранена.Не уверен, какая информация полезна, но, насколько я могу судить, она подключается.

Это операция метода, который я использую

<operation name="CheckRegistration">
  <soap:operation soapAction="urn:ScubaUpdateWSIntf-IScubaUpdateWS#CheckRegistration" style="rpc"/>
  <input>
    <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"     namespace="urn:ScubaUpdateWSIntf-IScubaUpdateWS"/>
  </input>
  <output>
    <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:ScubaUpdateWSIntf-IScubaUpdateWS"/>
  </output>
</operation> 

Это сообщение:

<message name="CheckRegistration10Request">
  <part name="centreId" type="xs:int"/>
  <part name="centreName" type="xs:string"/>
  <part name="checkActiveOnly" type="xs:boolean"/>
</message>
<message name="CheckRegistration10Response">
  <part name="return" type="xs:boolean"/>
</message>

Помимо импорта WSDL, добавления HTTPRIO и вызова метода с

(HTTPRIO1 as IScubaUpdateWS).CheckRegistration(strtoint(tcentre),tcentreName,true);

Я не думаю, что я делаю что-то еще, и, как я говорю, работает тот же кодна Delphi 2007.

1 Ответ

2 голосов
/ 24 января 2012

решаемая. Ну вроде! Похоже, что Delphi XE2 находит 2 службы, а Delphi 2007 - одну. Программа, которую я использую, читает местоположение WSDL из реестра и устанавливает его. На Delphi 2007 это нормально, потому что он принимает один-единственный сервис и делает этот выбранный порт / сервис. В Delphi XE2 выполняется сброс местоположения WSDL, в результате чего порт и служба очищаются. Спасибо @JohnEasley за указание в правильном направлении. Чтобы решить, я теперь должен использовать следующий код после изменения расположения WSDL. Не уверен, что это будет работать для всех, так как я предполагаю, что первая запись - та, которая требуется

servicenames:=Tdomstrings.Create;
portnames:=Tdomstrings.Create;
HTTPRIO1.WSDLItems.GetServices(servicenames);
if servicenames.count>0 then 
begin
 HTTPRIO1.Service:=servicenames[0];
 HTTPRIO1.WSDLItems.GetPortsForService(servicenames[0],portnames);
 if portnames.count>0 then
  HTTPRIO1.Port:=portnames[0];
end;
servicenames.clear;
servicenames.Free;
portnames.clear;
portnames.Free;

Спасибо, ребята

...