1

USPS EPFが提供する C# クライアント クラスを使用しています(Electronic Product Fulfillment) コンソール アプリケーションを介して USPS ファイルをダウンロードするため。コンソール アプリを使用して、USPS 資格情報でログインし、ダウンロードするファイルを指定して、ファイルを取得します。これはすべて、アクセスできる 2 つの小さなファイル (AMS 開発者キット、47.7 MB、および DPV 開発者キット、1.59 MB) に最適です。しかし、2.8 GB の AMS 商用 DVD ファイルをダウンロードしようとすると、本当に気にかけているのはこの 1 つだけで、問題が発生します。コンソール アプリは、毎回 1.75 GB でファイルのダウンロードを停止します。.tar ファイルなので、開いて内容の一部を確認できますが、当然、多くの内容が欠落しています。USPS 提供の Client クラスは、いかなる種類の例外やエラーもスローしません。ファイルの最後まで読み取るはずですが、途中で停止します。

考えられることはすべて試しました: HttpWebRequest プロパティを変更する (KeepAlive を true に変更し、タイムアウト値を増やす)、getEpfFile メソッドを変更して、MemoryStream の代わりに IsolatedStorageFile を使用してファイルを取得し、ネットワーク担当者に確認して作成することさえしました。タイムアウトの原因となる任意のネットワーク設定がないことを確認してください。自分のマシンと別のネットワーク サーバーからダウンロードを試みましたが、結果は同じでした。代わりに WebClient を使用することを検討しましたが、ダウンロードするファイルの URL 全体のパラメーターが必要であり、これは不明です。私が知る限り、USPS EPF ファイルにアクセスするには、HttpWebRequest を使用する必要があります。

これは、USPS が提供する Client.cs クラスの getEpfFile メソッドです (書式設定の問題についてお詫び申し上げます。このサイトでの最初の投稿です)。

// 実際のファイルを取得

    public bool getEpfFile(String fileid)
    {
        bool downloadSuccess = true;
        string strUrl = this.strBaseUrl + "/download/epf";

        try
        {

            Console.WriteLine("Starting file download ...");

            // add json to URL
            Dictionary<string, string> json_value = new Dictionary<string, string>();
            json_value.Add("logonkey", this.logon_key);
            json_value.Add("tokenkey", this.token_key);
            json_value.Add("fileid", fileid);

            JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
            string json_string = "obj=" + jsonSerializer.Serialize(json_value);

            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
            Byte[] byteArray = encoding.GetBytes(json_string);

            // set URL              
            Uri address = new Uri(strUrl);

            // web request  
            HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;

            request.UserAgent = "USPS .NET Sample";
            request.KeepAlive = false;
            request.Timeout = 100000;

            request.ProtocolVersion = HttpVersion.Version10;

            request.Method = "POST";
            request.ContentLength = byteArray.Length;
            request.ContentType = "application/x-www-form-urlencoded";

            // add headers
            // request.Headers.Add("Akamai-File-Request", filepath);
            request.Headers.Add("logonkey", this.logon_key);
            request.Headers.Add("tokenkey", this.token_key);
            request.Headers.Add("fileid", fileid);

            // post request
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();

            // Get response  
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;


            if (request.HaveResponse == true && response != null)
            {

                Stream remoteStream = response.GetResponseStream();

                Directory.CreateDirectory("c:\\Atemp");
                Stream localStream = File.Create("c:\\Atemp\\dd.tar");

                //byte[] buffer = new byte[2048];
                byte[] buffer = new byte[1000000];

                int bytesRead = 0;

                do
                {
                    // Read data (up to 1k) from the stream
                    bytesRead = remoteStream.Read(buffer, 0, buffer.Length);

                    // Write the data to the local file
                    localStream.Write(buffer, 0, bytesRead);

                } while (bytesRead > 0);


                int i = response.Headers.Count;


                for (int x = 0; x < i; x++)
                {

                    if (response.Headers.Keys[x].ToString() == "User-Tokenkey")
                    {
                        this.token_key = response.Headers[x].ToString();
                    }
                    else if (response.Headers.Keys[x].ToString() == "User-Logonkey")
                    {
                        this.logon_key = response.Headers[x].ToString();
                    }

                    else if (response.Headers.Keys[x].ToString() == "Service-Response")
                    {
                        Console.WriteLine("Web service result: " + response.Headers[x].ToString());
                    }
                    else if (response.Headers.Keys[x].ToString() == "Service-Messages")
                    {
                        Console.WriteLine("Resulting Messages: " + response.Headers[x].ToString());
                    }

                }

                // close resources
                localStream.Close();
                remoteStream.Close();
                response.Close();

                Console.WriteLine("File Download completed.");
            }
        }
        catch (Exception ex)
        {
            downloadSuccess = false;
            string str = ex.Message;
            str += "";
        }

        return downloadSuccess;
    }

早期に切断され続ける理由についての洞察は、非常に高く評価されます.

4

3 に答える 3

1

USPS には、私がやろうとしていることを 10 倍簡単に実行できるダウンロード マネージャー プログラムがずっとあることがわかりました。USPS の担当者から zip ファイルを直接メールで受け取りましたが、ドキュメント (ダウンロード リンクを含む) は、必要な場合はこちらから入手できます

于 2014-06-16T20:24:51.890 に答える
1

しばらく前に同じ問題に遭遇しましたが、ファイルが実際には AKAMAI サーバー上にあり、問題の原因となっている EPF サーバー上にないことが判明しました。2 GB を超える場合は、AKAMAI サーバー上にある可能性が最も高いため、以下のように機能するコードを示します。

 public static bool DownloadEPFByFileIDUsingNewList(ref USPSUserDTO obj, USPSProductsDTO productList)
    {
        USPSFileDTO userDTO = new USPSFileDTO();
        if (obj != null)
        {
            foreach (var product in productList.fileList)
            {
                product.productcode = "NCAW";
                product.productid = "NCL18H";
                downloadSelectedFile(product, ref obj);
            }
        }
        return true;
    }


     private static void downloadSelectedFile(USPSProductInfo uspsProductDownload, ref USPSUserDTO obj)
    {
        string serviceResponse = string.Empty;
        string serviceMessages = string.Empty;
        USPSProductInfo uspsProductInfo = uspsProductDownload;
        int downloadPercentage = 0;
        bool isAkamaiFile = IsAkamaiFile(uspsProductDownload.productcode); //true;

        try
        {
            string[] statusResponse = SetStatus(USPS_URL, VERSION, obj.logonkey, obj.tokenkey, "S", uspsProductInfo.fileid, obj.login, obj.pword);
            if (statusResponse != null)
            {
                obj.logonkey = statusResponse[0];
                obj.tokenkey = statusResponse[1];
            }
            Uri StatusURL = new Uri(USPS_URL + (isAkamaiFile ? "/download/file" : "/download/epf"));
            byte[] byteLength = new ASCIIEncoding().GetBytes("obj=" + new JavaScriptSerializer().Serialize((object)new Dictionary<string, string>()
            {
                {
                  "logonkey",
                  obj.logonkey
                },
                {
                  "tokenkey",
                  obj.tokenkey
                },
                {
                  "fileid",
                  uspsProductInfo.fileid
                }
            }));

            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(StatusURL);
            httpWebRequest.UserAgent = "EPF Download Manager - " + VERSION;
            httpWebRequest.KeepAlive = false;
            httpWebRequest.Timeout = 100000;
            httpWebRequest.Method = METHOD_TYPE;
            httpWebRequest.ContentLength = (long)byteLength.Length;
            httpWebRequest.ContentType = CONTENT_TYPE;
            (httpWebRequest.Headers).Add("Akamai-File-Request", uspsProductInfo.filepath + uspsProductInfo.filename);
            (httpWebRequest.Headers).Add("logonkey", obj.logonkey);
            (httpWebRequest.Headers).Add("tokenkey", obj.tokenkey);
            (httpWebRequest.Headers).Add("fileid", uspsProductInfo.fileid);

            //TODO chage path 
            string path = @"C:\try\newZipFiles" + "\\" + uspsProductInfo.fulfilled;
            if (!Directory.Exists(path))
                Directory.CreateDirectory(path);

            string outputFilePath = path + "\\" + uspsProductInfo.filename;

            Stream stream = ((WebRequest)httpWebRequest).GetRequestStream();
            stream.Write(byteLength, 0, byteLength.Length);
            stream.Close();
            HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;
            int headercount = httpWebResponse.Headers.Count;
            for (int headCount = 0; headCount < headercount; ++headCount)
            {
                if ((httpWebResponse.Headers.Keys[headCount]).ToString() == "User-Tokenkey")
                {
                    string responseToken = (httpWebResponse.Headers)[headCount].ToString();
                    if (responseToken.Contains(","))
                    {
                        responseToken = responseToken.Replace(",", "").Trim();
                    }
                    obj.tokenkey = responseToken.Trim();
                }
                else if ((httpWebResponse.Headers.Keys[headCount]).ToString() == "User-Logonkey")
                {
                    string responseLogonkey = ((httpWebResponse.Headers)[headCount]).ToString();
                    if (responseLogonkey.Contains(","))
                        responseLogonkey = responseLogonkey.Replace(",", "");
                    obj.logonkey = responseLogonkey.Trim();
                }
                else if ((httpWebResponse.Headers.Keys[headCount]).ToString() == "Service-Response")
                    serviceResponse = ((httpWebResponse.Headers)[headCount]).ToString().Replace(",", "").Trim();
                else if ((httpWebResponse.Headers.Keys[headCount]).ToString() == "Service-Messages")
                    serviceMessages = ((httpWebResponse.Headers)[headCount]).ToString();
            }

            if (serviceResponse == "success")
            {
                long countr = 0;
                Stream streamResponse = httpWebResponse.GetResponseStream();
                Stream fileStream = (Stream)System.IO.File.Create(outputFilePath);
                long downloadedFileSize = 0L;
                long originalFileSize = long.Parse(uspsProductInfo.filesize);
                byte[] bufferSize = isAkamaiFile ? new byte[1024] : new byte[512];
                int bytesRead = streamResponse.Read(bufferSize, 0, bufferSize.Length);
                try
                {
                    while (bytesRead > 0)
                    {
                        countr++;
                        fileStream.Write(bufferSize, 0, bytesRead);
                        downloadedFileSize += (long)bytesRead;
                        downloadPercentage = (int)(downloadedFileSize * 100L / originalFileSize);
                        bytesRead = streamResponse.Read(bufferSize, 0, bufferSize.Length);
                        Console.Clear();
                        Console.WriteLine("Downloaded " + downloadedFileSize + " of " + originalFileSize + " bytes." + " " + downloadPercentage + "%" + "counter" + countr);
                    }
                }
                catch (Exception)
                {
                }

                fileStream.Close();
                streamResponse.Close();
                httpWebResponse.Close();

                if (downloadedFileSize == long.Parse(uspsProductInfo.filesize))
                {
                    string[] statusCompleted = SetStatus(USPS_URL, VERSION, obj.logonkey, obj.tokenkey, "C", uspsProductInfo.fileid, obj.login, obj.pword);
                    if (statusCompleted != null)
                    {
                        obj.logonkey = statusCompleted[0];
                        obj.tokenkey = statusCompleted[1];
                    }
                }

            }

            ExtractRarFile(outputFilePath, uspsProductInfo.fulfilled, path);


        }
        catch (Exception exception_0)
        {

        }
        finally
        {

        }

    }


   public static bool IsAkamaiFile(string productCodeIn)
    {
        return productCodeIn == "AISVR" || productCodeIn == "AMS" || (productCodeIn == "NCAW" || productCodeIn == "NCAWM") || productCodeIn == "NCAM";
    }

製品コードを確認し、これを試してみてください。製品コードを調整することで機能します。頑張ってください。

于 2014-09-12T05:27:44.873 に答える
0

タイムアウトは 1 分強に設定されています...そんなに速くダウンロードできますか? タイムアウトを増やして、再試行してください。(ミリ秒単位なので注意)

于 2014-05-14T23:17:25.103 に答える