Класс ответа SOAP не назначен (ноль) - PullRequest
0 голосов
/ 24 октября 2018

Я использую Delphi 10.2.3 для использования веб-службы SOAP.Моя проблема заключается в том, что ответы веб-служб не назначаются классам ответов, определенным в wsdl, сгенерированном с использованием WSDLImp.exe.

. Я вижу, что необработанный XML-ответ содержит в себе всю информацию, как показано ниже:

HTTP/1.1 200
X-HP-CAM-COLOR: V=1;ServerAddr=5F+cgNOCZPdfvCQ4naSfjw==;GUID=1|xpjJ6o0v_kd3rKz0c1ASIUXW--xZpHqeH8lJ3S2l30SxOi2DzpzfGfLpdqdxt0lg|L2VhcnNpdi93cy9FYXJzaXZXZWJTZXJ2aWNl
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Date: Wed, 24 Oct 2018 15:54:46 GMT
Server: EARSIV
Strict-Transport-Security: max-age=157680000
Set-Cookie: cookiesession1=1BEDB4A4PX73WJCTCIRPOUP46FNNFC28;Path=/;HttpOnly

1da
<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:faturaOlusturResponse xmlns:ns2="http://service.earsiv.uut.cs.com.tr/"><return xmlns=""><resultCode>AE00067</resultCode><resultExtra></resultExtra><resultText>Web servis çağrısı "input" alanından gerekli bilgiler elde edilemedi. Eksik alanlar: null bu alan(lar)ın boş olmadığından emin olunuz!</resultText></return></ns2:faturaOlusturResponse></S:Body></S:Envelope>
0

return в faturaOlusturResponse - это nil, как я вижу при отладке.Попытка получить доступ к return.resultCode вызывает нарушение прав доступа.

То, что вы видите, правильно, что есть символы мусора непосредственно перед началом строки XML и сразу после нее.Я подозревал, что, возможно, причина.

Но;

1 - я вижу, Fiddler не имеет проблем с анализом этого и отображением отформатированного представления XML со всей правильной информацией.

2 - Я пытался использовать OnAfterExecute() событие THTTPRIO.Я вижу, что SOAPResponse.Size равно 474, что равно длине строки XML в приведенном выше необработанном ответе.

Я не могу придумать, в чем может быть проблема, и не смог ее исправить.Поиск в Интернете не помог.

Любая помощь приветствуется.

Спасибо.

WSDL URL: https://earsiv.efinans.com.tr/earsiv/ws/EarsivWebService?wsdl

РЕДАКТИРОВАТЬ: Использование метода веб-сервиса осуществляется с помощью функции AFaturaOlustur() ниже.Существует процедура SetSecurityHeader(), для которой требуется другой код устройства.Я не включил их всех, чтобы не публиковать здесь много кода.Json подпрограммы из mORMot framework.В некоторых частях кода также используются некоторые константы.Когда я читаю файл response.xml, написанный в процедуре HTTPRIO1AfterExecute() после запуска функции, появляется полный xml.Он идентичен приведенному выше в необработанном ответе:

class procedure TMyType.HTTPRIO1AfterExecute(const MethodName: string; SOAPResponse: TStream);
var
  List: TStringList;
begin
  List := TStringList.Create();
  try
    SOAPResponse.Position := 0;
    List.LoadFromStream(SOAPResponse);
    List.SaveToFile('response.xml');
  finally
    List.Free();
  end;
end;

function AFaturaOlustur(const Input: TFaturaOlusturInput; const GidenBelgeFormati: TGidenBelgeFormatlari; const GidenDosya, GelenDosya: string): Boolean;
var
  RIO: THTTPRIO;
  WS: EarsivWebService;
  Request: faturaOlustur;
  Response: faturaOlusturResponse;
  Json: RawUTF8;
begin
  if not TFile.Exists(GidenDosya) then
  begin
    LastError := 'AFaturaOlustur(): GidenDosya mevcut değil!';
  end;

  RIO := THTTPRIO.Create(nil);
  RIO.OnAfterExecute := TMyType.HTTPRIO1AfterExecute;
  RIO.URL := URLEArsivFatura;
  WS := (RIO as EarsivWebService);
  SetSecurityHeader(WS);

  Json := RecordSaveJSON(Input, TypeInfo(TFaturaOlusturInput));

  Request := nil;
  Response := nil;
  try
    Request := faturaOlustur.Create();
    Request.input := string(Json);
    Request.fatura := belge.Create();
    case GidenBelgeFormati of
      UBL: Request.fatura.belgeFormati := belgeFormatiEnum.UBL;
      CSXML: Request.fatura.belgeFormati := belgeFormatiEnum.CSXML;
      HTML: Request.fatura.belgeFormati := belgeFormatiEnum.HTML;
      PDF: Request.fatura.belgeFormati := belgeFormatiEnum.PDF;
      CUSTOM: Request.fatura.belgeFormati := belgeFormatiEnum.CUSTOM;
      PDF_CUSTOM: Request.fatura.belgeFormati := belgeFormatiEnum.PDF_CUSTOM;
      PDF_UBL: Request.fatura.belgeFormati := belgeFormatiEnum.PDF_UBL;
      CSXML1: Request.fatura.belgeFormati := belgeFormatiEnum.CSXML1;
      CSXML2: Request.fatura.belgeFormati := belgeFormatiEnum.CSXML2;
      CSXML3: Request.fatura.belgeFormati := belgeFormatiEnum.CSXML3;
      PDF_CSXML1: Request.fatura.belgeFormati := belgeFormatiEnum.PDF_CSXML1;
      PDF_CSXML2: Request.fatura.belgeFormati := belgeFormatiEnum.PDF_CSXML2;
      PDF_CSXML3: Request.fatura.belgeFormati := belgeFormatiEnum.PDF_CSXML3;
    end;
    Request.fatura.belgeIcerigi := ToByteDynArray(TFile.ReadAllBytes(GidenDosya));

    try
      Response := WS.faturaOlustur(Request);
    except
      on E: Exception do
      begin
        LastError := 'AFaturaOlustur(): ' + E.Message;
        Exit(False);
      end;
    end;
    Result := Assigned(Response.return);
    if Result then Result := Response.return.resultCode = rcSuccess;
    if Result then
    begin
      TFile.WriteAllBytes(GelenDosya, ToBytes(Response.output.belgeIcerigi));
    end
    else
    begin
      LastError := 'AFaturaOlustur(): ' + Response.return.resultText;
    end;
  finally
    Request.Free();
    Response.Free();
  end;
end;
...