我正在使用USPS EPF提供的 C# 客户端类(电子产品履行),以便通过控制台应用程序下载 USPS 文件。我使用我的控制台应用程序使用我的 USPS 凭据登录,指定我要下载的文件,然后获取文件。所有这些都非常适用于我们可以访问的两个较小的文件(AMS 开发工具包,47.7 MB 和 DPV 开发工具包,1.59 MB)。但是,当我尝试下载我唯一真正关心的 2.8 GB AMS Commercial DVD 文件时,我遇到了问题。控制台应用程序每次都会停止下载 1.75 GB 的文件。由于是.tar 文件,我可以打开它并看到一些内容,但自然会丢失很多内容。USPS 提供的客户端类不会引发任何类型的异常或错误;它应该读到文件的末尾,但它只是提前停止了。
我已经尝试了我能想到的一切:更改 HttpWebRequest 属性(将 KeepAlive 更改为 true,增加 Timeout 值),修改 getEpfFile 方法以使用 IsolatedStorageFile 而不是 MemoryStream 来获取文件,甚至与我们的网络人员核实确保没有导致超时的任意网络设置。我尝试从我的机器和不同的网络服务器下载,结果相同。我考虑改用 WebClient ,但这需要下载文件的整个 URL 的参数,这是未知的。据我所知,我必须使用 HttpWebRequest 来访问 USPS EPF 文件。
这是 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;
}
任何关于它为什么会提前中断的见解都将受到极大的赞赏。