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;
}
早期に切断され続ける理由についての洞察は、非常に高く評価されます.