以下是Delphi导入 WSDL 时生成的文件:
// ********** //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL     : http://192.168.0.100:8082/MyBloodReimburseInterface/dtoGlobalDefElementBlood?wsdl
// Encoding : UTF-8
// Version  : 1.0
// (2012-07-19 13:42:35 - 1.33.2.5)
// ********** //unit dtoGlobalDefElementBlood;interfaceuses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;type  // ********** //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Borland types; however, they could also 
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ********** //
  // !:string          - "http://www.w3.org/2001/XMLSchema";
  // !:dateTime        - "http://www.w3.org/2001/XMLSchema";
  // !:int          - "http://www.w3.org/2001/XMLSchema";
  // !:float          - "http://www.w3.org/2001/XMLSchema";  globalDefElementBlood = class;          { "cn.myblood.reimburse.out.service" }
  bloodRecordDorinfo   = class;          { "cn.myblood.reimburse.out.service" }
  models          = class;          { "cn.myblood.reimburse.out.service" }  // ********** //
  // Namespace : cn.myblood.reimburse.out.service
  // ********** //
  globalDefElementBlood = class(TRemotable)
  private
    Fn1: WideString;
    Fn2: WideString;
    Fn3: WideString;
  published
    property n1: WideString read Fn1 write Fn1;
    property n2: WideString read Fn2 write Fn2;
    property n3: WideString read Fn3 write Fn3;
  end;  // ********** //
  // Namespace : cn.myblood.reimburse.out.service
  // ********** //
  bloodRecordDorinfo = class(TRemotable)
  private
    Fn1: WideString;
    Fn10: TXSDateTime;
    Fn11: WideString;
    Fn12: WideString;
    Fn13: WideString;
    Fn14: WideString;
    Fn15: WideString;
    Fn16: WideString;
    Fn17: TXSDateTime;
    Fn18: Integer;
    Fn19: Single;
    Fn2: WideString;
    Fn20: Integer;
    Fn21: TXSDateTime;
    Fn22: WideString;
    Fn23: Integer;
    Fn24: Integer;
    Fn25: Integer;
    Fn26: WideString;
    Fn3: WideString;
    Fn4: Integer;
    Fn5: WideString;
    Fn6: Integer;
    Fn7: TXSDateTime;
    Fn8: WideString;
    Fn9: WideString;
  public
    destructor Destroy; override;
  published
    property n1: WideString read Fn1 write Fn1;
    property n10: TXSDateTime read Fn10 write Fn10;
    property n11: WideString read Fn11 write Fn11;
    property n12: WideString read Fn12 write Fn12;
    property n13: WideString read Fn13 write Fn13;
    property n14: WideString read Fn14 write Fn14;
    property n15: WideString read Fn15 write Fn15;
    property n16: WideString read Fn16 write Fn16;
    property n17: TXSDateTime read Fn17 write Fn17;
    property n18: Integer read Fn18 write Fn18;
    property n19: Single read Fn19 write Fn19;
    property n2: WideString read Fn2 write Fn2;
    property n20: Integer read Fn20 write Fn20;
    property n21: TXSDateTime read Fn21 write Fn21;
    property n22: WideString read Fn22 write Fn22;
    property n23: Integer read Fn23 write Fn23;
    property n24: Integer read Fn24 write Fn24;
    property n25: Integer read Fn25 write Fn25;
    property n26: WideString read Fn26 write Fn26;
    property n3: WideString read Fn3 write Fn3;
    property n4: Integer read Fn4 write Fn4;
    property n5: WideString read Fn5 write Fn5;
    property n6: Integer read Fn6 write Fn6;
    property n7: TXSDateTime read Fn7 write Fn7;
    property n8: WideString read Fn8 write Fn8;
    property n9: WideString read Fn9 write Fn9;
  end;  // ********** //
  // Namespace : cn.myblood.reimburse.out.service
  // ********** //
  models = class(TRemotable)
  private
    FbrdInfo: bloodRecordDorinfo;
    FgdeBlood: globalDefElementBlood;
  public
    destructor Destroy; override;
  published
    property brdInfo: bloodRecordDorinfo read FbrdInfo write FbrdInfo;
    property gdeBlood: globalDefElementBlood read FgdeBlood write FgdeBlood;
  end;  // ********** //
  // Namespace : cn.myblood.reimburse.out.service
  // transport : http://schemas.xmlsoap.org/soap/http
  // style     : document
  // binding   : GlobalDefElementBloodServiceOutImplServiceSoapBinding
  // service   : GlobalDefElementBloodServiceOutImplService
  // port      : GlobalDefElementBloodServiceOutImplPort
  // URL       : http://192.168.0.100:8082/MyBloodReimburseInterface/dtoGlobalDefElementBlood
  // ********** //
  GlobalDefElementBloodServiceOut = interface(IInvokable)
  ['{B15820AD-9413-6AAB-3B69-90F10344FF69}']
    function  sendGlobalDefElementBloodReques(const globalDefElementBloods: models): Integer; stdcall;
  end;  RequestSOAPHeader = class(TSOAPHeader)// 为手工添加,且必须与文档中的同名
  private
    Fusername: WideString;
    Fpassword: WideString;
  published
    property userName: WideString read Fusername write Fusername;
    property password: WideString read FpassWord write Fpassword;
  end;  function GetGlobalDefElementBloodServiceOut(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): GlobalDefElementBloodServiceOut;implementationfunction GetGlobalDefElementBloodServiceOut(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): GlobalDefElementBloodServiceOut;
const
  defWSDL = 'http://192.168.0.100:8082/MyBloodReimburseInterface/dtoGlobalDefElementBlood?wsdl';
  defURL  = 'http://192.168.0.100:8082/MyBloodReimburseInterface/dtoGlobalDefElementBlood';
  defSvc  = 'GlobalDefElementBloodServiceOutImplService';
  defPrt  = 'GlobalDefElementBloodServiceOutImplPort';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as GlobalDefElementBloodServiceOut);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;
destructor bloodRecordDorinfo.Destroy;
begin
  if Assigned(Fn10) then
    Fn10.Free;
  if Assigned(Fn17) then
    Fn17.Free;
  if Assigned(Fn21) then
    Fn21.Free;
  if Assigned(Fn7) then
    Fn7.Free;
  inherited Destroy;
end;destructor models.Destroy;
begin
  if Assigned(FbrdInfo) then
    FbrdInfo.Free;
  if Assigned(FgdeBlood) then
    FgdeBlood.Free;
  inherited Destroy;
end;initialization
  InvRegistry.RegisterInterface(TypeInfo(GlobalDefElementBloodServiceOut), 'cn.myblood.reimburse.out.service', 'UTF-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(GlobalDefElementBloodServiceOut), '');
  //InvRegistry.RegisterInvokeOptions(TypeInfo(GlobalDefElementBloodServiceOut), ioDocument);
  RemClassRegistry.RegisterXSClass(globalDefElementBlood, 'cn.myblood.reimburse.out.service', 'globalDefElementBlood');
  RemClassRegistry.RegisterXSClass(bloodRecordDorinfo, 'cn.myblood.reimburse.out.service', 'bloodRecordDorinfo');
  RemClassRegistry.RegisterXSClass(models, 'cn.myblood.reimburse.out.service', 'models');  InvRegistry.RegisterHeaderClass(TypeInfo(GlobalDefElementBloodServiceOut), RequestSOAPHeader,'','');
  RemClassRegistry.RegisterXSClass(RequestSOAPHeader,'');  
end.

解决方案 »

  1.   

    执行以下函数时报错:
    procedure TForm1.Button5Click(Sender: TObject);
    var
      MyWebService: GlobalDefElementBloodServiceOut;
      myHeader: dtoGlobalDefElementBlood.RequestSOAPHeader;
      Headers: ISOAPHeaders;
      vSendModel: dtoGlobalDefElementBlood.Models;  globalDefElementBloods: models;
      gdeBlood: globalDefElementBlood;  vResult: Integer;
    begin
      // 填写包头
      myHeader := dtoGlobalDefElementBlood.RequestSOAPHeader.Create;
      myHeader.userName := 'gzws';
      myHeader.password := '456';  HTTPRIO.URL := 'http://192.168.0.100:8082/MyBloodReimburseInterface/dtoGlobalDefElementBlood?wsdl';
      MyWebService := (HttpRIO as GlobalDefElementBloodServiceOut);  Headers := (MyWebService as ISOAPHeaders);
      Headers.Send(myHeader);//发送包头进行验证  vSendModel := dtoGlobalDefElementBlood.Models.Create;
      //vSendModel.brdInfo  := dtoGlobalDefElementBlood.bloodRecordDorinfo.Create;
      vSendModel.gdeBlood := dtoGlobalDefElementBlood.globalDefElementBlood.Create;  vSendModel.gdeBlood.n1 := '01';
      vSendModel.gdeBlood.n2 := '全血类';
      vSendModel.gdeBlood.n3 := '测试备注';  vResult := MyWebService.sendGlobalDefElementBloodReques(vSendModel);//此行出错,错误提示为: Fault occurred while processing,而且这只是传一条记录,如果要传多条记录,该如何操作?
      if vResult = 0 then
         ShowMessage('OK')
      else
         ShowMessage('No');
      if myHeader <> nil then
         FreeAndNil(myHeader);
         
    end;以下为WEB SERVICE 提供的文档:
    SOAP包体实例
         <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/";>
         <soap:Header>
        <RequestSOAPHeader xmlns="http://localhost:6543/MyBloodReimburseInterface/dtoGlobalDefElementBlood?wsdl";>
           <userName>gzws</userName>
           <password>456</password>
           </RequestSOAPHeader>
         </soap:Header>
         <soap:Body>
           <ns2:sendGlobalDefElementBloodReques xmlns:ns2="cn.myblood.reimburse.out.service">
             <globalDefElementBloods>
               <gdeBlood>
                 <n1>01</n1>
                 <n2>全血类</n2>
                 <n3>备注</n3>
               </gdeBlood>
               <gdeBlood>
                 <n1>02</n1>
                 <n2>半血类</n2>
                 <n3>备注果右是要右蚵啡是右果顺要林要中可晨</n3>
               </gdeBlood>
             </globalDefElementBloods>
            </ns2:sendGlobalDefElementBloodReques>
         </soap:Body>
        </soap:Envelope>这是服务端收到的包,包体与文档中的不一致。
    ID: 376
    Address: http://192.168.0.100:8082/MyBloodReimburseInterface/dtoGlobalDefElementBlood?wsdl
    Encoding: ISO-8859-1
    Http-Method: POST
    Content-Type: text/xml
    Headers: {cache-con_trol=[no-cache], con_nection=[Keep-Alive], Content-Length=[1184], content-type=[text/xml], host=[192.168.0.100:8082], SOAPAction=[""], user-agent=[Borland SOAP 1.2]}
    Payload: <?xml version="1.0"?>
    <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"; xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/";><SOAP-ENV:Header SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"; xmlns:NS1="urn:dtoGlobalDefElementBlood">
    <NS1:RequestSOAPHeader xsi:type="NS1:RequestSOAPHeader"><userName xsi:type="xsd:string">gzws</userName>
    <password xsi:type="xsd:string">456</password></NS1:RequestSOAPHeader></SOAP-ENV:Header>//以下为包体
    <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"; xmlns:NS3="cn.myblood.reimburse.out.service">
    <NS2:sendGlobalDefElementBloodReques xmlns:NS2="cn.myblood.reimburse.out.service"><globalDefElementBloods href="#2"/>
    </NS2:sendGlobalDefElementBloodReques><NS3:models id="2" xsi:type="NS3:models"><brdInfo xsi:nil="true"/>
    <gdeBlood href="#3"/></NS3:models>
    <NS3:gdeBlood id="3" xsi:type="NS3:globalDefElementBlood">
    <n1 xsi:type="xsd:string">01</n1><n2 xsi:type="xsd:string">全血类</n2>
    <n3 xsi:type="xsd:string">测试备注¨</n3>
    </NS3:gdeBlood>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
      

  2.   

    D7支持的webservice标准太老,换D2010吧
      

  3.   

    楼主,你换成2010以上版本的DELPHI,说不定问题就解决了~~