Suche…


Einführung

In diesem Thema wird beschrieben, wie Sie Dateien herunterladen, die an eine Detailentität in Acumatica ERP mithilfe der vertragsbasierten API angefügt sind.

Bemerkungen

Das obige Code-Snippet wurde mit dem Json.NET-Framework ( Newtonsoft.Json.dll ) erstellt.

Um einen HTTP-Cookie-Header aus einer SOAP-Antwort zu erhalten, fügen Sie einen Verweis auf die Assemblys System.ServiceModel und System.ServiceModel.

using System.ServiceModel;
using System.ServiceModel.Web;

In der vertragsbasierten SOAP-API von Acumatica gibt es eine Einschränkung, die das Herunterladen von Anhängen nur für eine Entität der obersten Ebene ermöglicht. Jeder Versuch, die GetFiles () -Methode zu verwenden, um die Anhänge einer Detailentität abzurufen , führt leider zu dem Fehler " Entität ohne Bildschirmbindung kann nicht als Entität der obersten Ebene verwendet werden. " Entität der Ebene, die im Web-Service-Endpunkt definiert ist.

Eine weitere Einschränkung bei der GetFiles () - Methode besteht darin, dass immer der Inhalt aller an eine Entität angehängten Dateien zurückgegeben wird. Es gibt keine Option, nur die Dateinamen abzurufen und dann zu entscheiden, welche Datei (en) von Acumatica heruntergeladen werden sollen.

Glücklicherweise gibt es eine bessere und besser kontrollierbare Möglichkeit, mit Anhängen zu arbeiten, die mit der vertragsbasierten REST-API bereitgestellt werden. Die files Array zurückgegeben als Teil eines jeden von dem vertragsbasierte REST API exportierte Einheit enthält nur:

  • Dateinamen (die Eigenschaft Dateiname )
  • Dateikennungen (die ID- Eigenschaft)
  • Hypertextverweise (die Eigenschaft href ), die später zum Herunterladen von Dateiinhalten verwendet werden können

Ein Beispiel für das Abrufen einer Liste von Dateien, die an eine Entität angehängt sind, vom Web-Service-Endpunkt und das Abrufen bestimmter Dateiinhalte über die vertragsbasierte REST-API finden Sie in der Acumatica-Produkthilfe

Wie kann man die an eine Detaileinheit angehängten Dateien herunterladen, wenn das gesamte Integrationsprojekt mit der vertragsbasierten SOAP-API entwickelt wurde? Wie im folgenden Codeausschnitt gezeigt, ist es möglich, den HTTP-Cookie-Header von einer SOAP-Antwort an den REST-API-Client zu übergeben, der ausschließlich für die Arbeit mit den Anhängen verwendet wird:

using (var soapClient = new DefaultSoapClient())
{
    var address = new Uri("http://localhost/AcumaticaERP/entity/Default/6.00.001/");
    CookieContainer cookieContainer;
    using (new OperationContextScope(soapClient.InnerChannel))
    {
        soapClient.Login(login, password, null, null, null);
        string sharedCookie = WebOperationContext.Current.IncomingResponse.Headers["Set-Cookie"];
        cookieContainer = new CookieContainer();
        cookieContainer.SetCookies(address, sharedCookie);
    }
    try
    {
        var shipment = new Shipment()
        {
            ShipmentNbr = new StringSearch { Value = "001301" },
            ReturnBehavior = ReturnBehavior.OnlySpecified
        };
        shipment = soapClient.Get(shipment) as Shipment;

        var restClient = new HttpClient(
            new HttpClientHandler
            {
                UseCookies = true,
                CookieContainer = cookieContainer
            });
        restClient.BaseAddress = address;// new Uri("http://localhost/059678/entity/Default/6.00.001/");

        var res = restClient.GetAsync("Shipment/" + shipment.ID + "?$expand=Packages")
            .Result.EnsureSuccessStatusCode();
        var shipmentWithPackages = res.Content.ReadAsStringAsync().Result;

        JObject jShipment = JObject.Parse(shipmentWithPackages);
        JArray jPackages = jShipment.Value<JArray>("Packages");
        foreach (var jPackage in jPackages)
        {
            JArray jFiles = jPackage.Value<JArray>("files");
            string outputDirectory = ".\\Output\\";
            if (!Directory.Exists(outputDirectory))
            {
                Directory.CreateDirectory(outputDirectory);
            }

            foreach (var jFile in jFiles)
            {
                string fullFileName = jFile.Value<string>("filename");
                string fileName = Path.GetFileName(fullFileName);
                string href = jFile.Value<string>("href");

                res = restClient.GetAsync(href).Result.EnsureSuccessStatusCode();
                byte[] file = res.Content.ReadAsByteArrayAsync().Result;
                System.IO.File.WriteAllBytes(outputDirectory + fileName, file);
            }
        }
    }
    finally
    {
        soapClient.Logout();
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow