Header Image

Translate

dinsdag 8 december 2015

Kopieer een groot binair bestand naar de server

De meest makkelijke manier om een binair bestand naar de server te communiceren is met behulp van de bindata componenten:
Effectie wordt deze wijze ook gebruikt om documenten in de database op te slaan in document-verwerking functionaliteit. Hier gebruik ik even de 'appendToFile'. Vreemd genoeg is in Ax 2009 (SP1) geen FileIOPermission nodig, maar dat is even niet het punt. Het punt is als het bestand te groot wordt (12MB):


"The Dynamics Ax session is no longer valid" op het moment dat de setData wordt aangeroepen. Dit gebeurd ook als je documentverwerking opslaat in de database en even het limiet hoog genoeg zet.

Je kan proberen de getData eerst toe te wijzen aan een container, maar wederom gaat bij setData dit fout.

Het bindata object heeft een methode: copyData. Leuke functie met een offset en grootte. Zou je de buffer in delen naar de server kunnen sturen, maar helaas:

Dit is zelfs erger. Deze actie zorgt ervoor dat de AOS gewoon crashed.


De enige oplossing die ik zover heb gevonden is het eerst kopieren naar een kleine buffer en die dan serverside toe te voegen:


Code:

static void Example_File2_C(Args _args)
{
    BinData clientBin    = ClassFactory::makeObjectOnClient(classnum(BinData));
    BinData clientBinTmp = ClassFactory::makeObjectOnClient(classnum(BinData));
    BinData serverBin    = ClassFactory::makeObjectOnServer(classnum(BinData));
    str fileName = @"C:\Ax\Client\file2.bin";
    str fileNameServer = @"C:\Ax\Server\file2.bin";
    int fileSize;
    int offset;
    int bufferSize = 1024*1024; // 1MB;
    ;
    #file

    clientBin.loadFile(fileName);
    fileSize = clientBin.size();
    offset = 0;
    while (offset < fileSize)
    {
        clientBinTmp.copyData(clientBin, offset, bufferSize);

        serverBin.setData(clientBinTmp.getData());
        serverBin.appendToFile(fileNameServer);

        offset += bufferSize;
    }

    info('Done!');
}

Dit behoud niet de bestandsinformatie (gemaakt op datum, NTFS beveiliging etc.) maar de data is serverside. Nog een leuke progress-bar om de gebruiker tevreden te houden en je hebt een manier. 

maandag 7 december 2015

Unable to load page–Ax portal via business connector

Een nieuwe installatie van een Ax 4.0 sharepoint omgeving op een windows 2008 machine gaf een fout bij het maken van de PDF: ‘Unable to load page.’ in de eventlog. De PDF zelf is intern zo goed als leeg::

Er zijn veel artikelen te vinden over dit onderwerp, en de fout leek veroorzaakt te worden door de Ax client, of in dit geval de business connector gezien dat het een portal is. Maar SP2 met de hotfix is geïnstalleerd en bij het starten van de setup zegt de setup-util dat de versie al geïnstalleerd zijn. De business connector DLL in de client bin bevestigt dit verhaal:

    Version 4.0.2503.1872.

Middels een simpele info in een portal webform kreeg ik echter een andere versie:

    Kernel version: 4.0.2163.0

Runtime was de versie dus 4.0.2163.0 (SP1). In de GAC (Global Asembly Cache) was inderdaad een andere DLL geïnstalleerd:

Oplossing was simpel: opnieuw registeren van de DLL in de client bin map. Maar deze productie server had geen powerhell of .NET SDK toolkit (gacutil.exe) om een DLL te registreren. Daarop heb ik tijdelijk even de toolkit van mijn laptop (Windows 10) gekopieerd naar de server::
C:\Program Files (x86)\Microsoft SDKs\Windows

Er zijn 3 mappen: gacutil zit in 2 van deze mappen(v7.0a en v8.0a). Gebruik hier de v7.0a, bij de v8.0a krijg je een melding: :
entry point was not found
De volgende DLL's heb ik geregistreerd:
  • C:\Program Files\Microsoft Dynamics AX\40\Client\Bin\Microsoft.Dynamics.BusinessConnectorNet.dll
  • C:\Program Files\Microsoft Dynamics AX\40\Client\Bin\Microsoft.Dynamics.ClrBridge.dll
  • C:\Program Files\Microsoft Dynamics AX\40\Client\Bin\NL\Microsoft.Dynamics.BusinessConnectorNet.resources.dll
En nu is de portal het met mij eens over welke versie er is:

En de PDF wordt weer juist gegenereerd.