У меня очень интересная проблема, когда я вызываю метод SOAP с моим клиентом, я должен передать параметр, который имеет тип Array_Of_Int (Array_Of_Int = array of Integer), проблема заключается в том, что, когда массив генерируется в запросе , он генерирует следующее
<ArrayParam>
<item>12345</item>
<item>23456</item>
<item>34567</item>
</ArrayParam>
но я полагаю, что сервер ожидает
<ArrayParam>12345</ArrayParam>
<ArrayParam>23456</ArrayParam>
<ArrayParam>34567</ArrayParam>
Я почти уверен, что Delphi как-то обходит эту проблему в RegisterSerializeOptions или RegisterInvokeOptions, однако, похоже, я не могу найти проблему, мысли?!
Спасибо всем за потраченное время, я использую Delphi 2010.
РЕДАКТИРОВАТЬ: чтобы исправить эту проблему, как упомянул Бруно, нам нужно добавить следующий код в раздел инициализации сгенерированного файла .pas:
InvRegistry.RegisterInvokeOptions(TypeInfo(<ServerInterfaceNameHere>), ioDocument);
Однако это вызывает еще одну проблему - пространство имен, поскольку это быстрое и довольно элегантное исправление. Я добавил следующий код в метод OnBeforeExecute THTTPRio
procedure TMyDataModule.MyRioBeforeExecute(const MethodName: string; SOAPRequest: TStream);
procedure FixNamespaces;
var
LStrings: TStringList;
begin
LStrings := TStringList.Create;
try
SOAPRequest.Position := 0;
LStrings.LoadFromStream(SOAPRequest);
SOAPRequest.Position := 0;
SOAPRequest.Size := 0;
LStrings.Text := StringReplace(LStrings.Text, MethodName, 'NS1:' + MethodName, [rfReplaceAll]);
LStrings.Text := StringReplace(LStrings.Text, MethodName + ' xmlns', MethodName + ' xmlns:NS1', []);
LStrings.SaveToStream(SOAPRequest);
SOAPRequest.Position := 0;
finally
FreeAndNil(LStrings);
end; // tryf
end; // procedure FixNamespaces;
begin
FixNamespaces;
end;
Выше приведено просто исправление, я действительно надеюсь, что смогу найти более чистое и элегантное решение этой проблемы, если кто-нибудь знает, пожалуйста, отправьте свой ответ .