1

以下は、Borland C++ Builder 6 で開発されたアプリケーションで Web サービス クライアントを開発する段階的な試みです。 C++ ビルダー XE3)。これは、Borland 6 C++ Builder で Soap を使用する試みです。Borland 6 は SOAP ヘッダー (InvokeRegistry.hpp がない) を管理しておらず、リクエストを送信する SOAP サーバーは、このインターフェースのログイン後に Cookie を渡す必要があるため、これまでは成功できなかったと結論付けています。

    __interface INTERFACE_UUID("{B0F412ED-AC6A-42C3-8730-DD0D9680F16D}") AuthenticationSoap : public IInvokable
    {
    public:
      virtual LoginResult*    Login(const AnsiString username, const AnsiString password) = 0; 
      virtual AuthenticationMode Mode() = 0; 
    };
    typedef DelphiInterface<AuthenticationSoap> _di_AuthenticationSoap;

このログインは最初に次を送信します。

    500 Server Internal Error

この呼び出しを追加すればOKです:

    InvRegistry()->RegisterInvokeOptions(__interfaceTypeinfo(AuthenticationSoap), ioDocument);

次に、ユーザー名を HTTPRIO に渡します。

    MyHTTPRIO->HTTPWebNode->UserName = AnsiString("xxx...");

そして、この HTTPRIO が 2 番目のインターフェースに渡されます。

    __interface INTERFACE_UUID("{1E5B3820-A40E-FD40-326D-95A9F6B7A5F0}") OrganizerWS_1_1Soap : public IInvokable
    {
    public:
    ...
    virtual void            findHorse(const ArrayOfString FEIIDs, const AnsiString Name, const AnsiString SexCode, const bool IsPony, const AnsiString AthleteFEIID, ArrayOfHorseOC& findHorseResult, ArrayOfMessage& Messages) = 0;
    ...
    };
    typedef DelphiInterface<OrganizerWS_1_1Soap> _di_OrganizerWS_1_1Soap;
    _di_OrganizerWS_1_1Soap GetOrganizerWS_1_1Soap(bool useWSDL=false, AnsiString addr="", Soaphttpclient::THTTPRIO* HTTPRIO=0);

しかし、ヘッダーのコードを生成しない Borland 6 の WSDL インポーターを使用しており、ヘッダーが Invokeregistry.hpp で定義されていないため、「AuthHeader is missing」というエラーが発生します。したがって、HTTPRIO の「BeforeExecute」には、次の要求があります。

    <?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">
    <SOAP-ENV:Body>
        <findHorse xmlns="http://fei.org/">
            <FEIIDs/>
            <Name></Name>
            <SexCode></SexCode>
            <IsPony>false</IsPony>
            <AthleteFEIID>10002254</AthleteFEIID>
            <findHorseResult/>
            <Messages/>
        </findHorse>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

一方、Borland XE3 はこの要求を生成しますが、これは問題なく、サーバーから期待される応答をもたらします。

    <?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">
    <SOAP-ENV:Header>
        <NS1:AuthHeader xmlns:NS1="http://fei.org/">
            <UserName xmlns="http://fei.org/">xxx...</UserName>
            <Language xmlns="http://fei.org/">en</Language>
        </NS1:AuthHeader>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <findHorse xmlns="http://fei.org/">
            <IsPony>false</IsPony>
            <AthleteFEIID>10002254</AthleteFEIID>
        </findHorse>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

だからまず交換した

    <SOAP-ENV:Body>

    <SOAP-ENV:Header><NS1:AuthHeader xmlns:NS1="http://fei.org/"><UserName xmlns="http://fei.org/">xxx...</UserName><Language xmlns="http://fei.org/">en</Language></NS1:AuthHeader></SOAP-ENV:Header><SOAP-ENV:Body>

次に、「<< xoHolderClass << xoInlineArrays」などのオプションを追加しました。

    RemClassRegistry()->RegisterSerializeOptions(__classid(findHorse), (TSerializationOptions() << xoHolderClass << xoInlineArrays));

ここで同じ要求を取得しますが、サーバーの応答は NULL 配列ですが、borland xe3 で記述されたテストへの応答には 3 つの項目があります。または、他の操作 (xo... オプションなし) を使用すると、デルファイ インターフェイスのデストラクタでアクセス違反が発生します。

    __fastcall ~DelphiInterface<T>()
      {
            if (intf != 0) 
            {
              intf->Release();
              intf = 0;
            }
      }

CAPICOM を使用して、XML を作成し、Indy コンポーネントで送信することを考えました (ただし、同じ認証ヘッダーの問題が発生することを期待していますか?)、CAPICOM を使用するか、またはWindows SDK ? ...) しかし、今まで成功せず、前に述べたように、C++ Builder XE3 で開発された dll を使用しようとしています: https://stackoverflow.com/questions/15485276/embarcadero-c-xe3-dll-imported -in-c-xe3-project-library-loads-but-access-v

4

0 に答える 0