#c# #xml #web-services #delphi #wsdl
#c# #xml #веб-сервисы #delphi #wsdl
Вопрос:
Я новичок в работе со службой WSDL, и я столкнулся с проблемой в ответе, полученном от службы, и технические детали:
1- Сервис построен с использованием C # и описания из файла .pas :
// Namespace : http://tempuri.org/
// soapAction: http://tempuri.org/IService/%operationName%
// transport : http://schemas.xmlsoap.org/soap/http
// style : document
// use : literal
// binding : BasicHttpBinding_IService
// service : Service
// port : BasicHttpBinding_IService
// URL : http://website.com/WCF/ServiceRegistryWCF.Service.svc
IService= interface(IInvokable)
2- описание основного объекта из файла .pas :
// XML : InOut, global, <complexType>
// Namespace : http://schemas.datacontract.org/2004/07/MySDK.Accomodation
InOut2 = class(IBusinessObject2)
3- Я вызываю службу следующим образом:
var
Form1: TForm1;
HRIO: THTTPRIO;
procedure MyProcedure();
var
ioObj: InOut2;
res: string;
begin
HRIO := THTTPRIO.Create(nil);
HRIO.OnAfterExecute := THRIOActions.HTTPRIO1AfterExecute;
HRIO.OnBeforeExecute := THRIOActions.HTTPRIO1BeforeExecute;
HRIO.WSDLLocation := 'http://website.com/WCF/ServiceRegistryWCF.Service.svc?wsdl';
HRIO.Service := 'Service';
HRIO.Port := 'BasicHttpBinding_IService';
HRIO.HTTPWebNode.InvokeOptions := [soIgnoreInvalidCerts, soAutoCheckAccessPointViaUDDI];
HRIO.Converter.Options := HRIO.Converter.Options [soDocument, soLiteralParams];
HRIO.Converter.Encoding := 'utf-8';
ioObj := InOut2.Create;
ioObj.UserName := '1234567890';
ioObj.Password := '123456';
ioObj.InOutID := 123456789;
res := (HRIO as IService).ProcedureName('password', ioObj, 0);
memo1.lines.add(res);
end;
Когда я отслеживал процесс с помощью двух процедур («HTTPRIO1AfterExecute», «HTTPRIO1BeforeExecute») Я нашел результат следующим образом:
Текст запроса:
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<ProcedureName xmlns="http://tempuri.org/">
<LocalPassword>password</LocalPassword>
<io>
<InOutID xmlns="http://schemas.datacontract.org/2004/07/MySDK.Accomodation">
123456789
</InOutID>
<Password xmlns="http://schemas.datacontract.org/2004/07/MySDK.Accomodation">
123456
</Password>
<UserName xmlns="http://schemas.datacontract.org/2004/07/MySDK.Accomodation">
1234567890
</UserName>
</io>
<language>0</language>
</ProcedureName>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Текст ответа:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<ProcedureNameResponse xmlns="http://tempuri.org/">
<ProcedureNameResult i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>
</ProcedureNameResponse>
</s:Body>
</s:Envelope>
И конечный результат был:
<ProcedureNameResult xmlns="http://tempuri.org/" i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>
Но это должно быть либо True, либо текстовое сообщение на случай возникновения ошибки, и, как вы можете видеть, результат отличается от ожидаемого.
Прошу прощения за продление, но я попытался объяснить все возможные детали.
Комментарии:
1. Вы не получаете никаких ошибок. Ваш запрос является запросом, и данные с параметром поиска не найдены. Мы не сможем помочь. Я бы сначала попробовал запрос, чтобы получить все идентификаторы в базе данных. Затем убедитесь, что запрашиваемый вами идентификатор действительно находится в базе данных.
2. Спасибо за ваш ответ, я знаю, что я не получаю никакой ошибки, но результат, который я получаю, является ошибкой, как я упоминал ранее, результатом должен быть один из двух вариантов (True / ErrorMessage), и даже если идентификаторы отсутствуют в базе данных, служба вернет сообщение, указывающее на это.
3. Что я пытаюсь проверить, верны ли настройки на шаге No3, или я что-то пропустил.
4. Если InOutID отсутствует на компьютере, вы получите именно те результаты, которые получаете. Итак, код хорош, но параметры запроса (имя пользователя, пароль, идентификатор) не соответствуют никаким данным.
5. Я бы попробовал использовать что-то вроде PostMan и посмотрел, какой ответ вы получите, используя значения из вашего запроса. Это, по крайней мере, подтвердит, что ваш запрос настроен правильно. У меня нет никакой связи с PostMan, кроме того, что я нахожу его полезным инструментом.