2

我在下面编写了 C# 应用程序,以通过 PhoneGap Build API 更新现有应用程序。我注意到当我的 .ZIP 文件为 127kb 或更少时它可以工作。一旦达到 128kb,我就会收到 500 HTTP 响应。抱歉,API 不返回任何有关错误的详细信息,仅返回 500 响应代码。对此问题的任何帮助将不胜感激。请注意身份验证令牌、appId 和 .zip 文件位置的占位符。谢谢。

using System;
using System.IO;
using System.Net;

namespace PhoneGapBuildQuestion
{
    class Program
    {
        static void Main(string[] args)
        {
            string token = "<add your token here>";
            string appId = "<add your appId here>";
            string zipFile = "<add full path to the application .zip file here>";
            var info = new FileInfo(zipFile);
            var request = (HttpWebRequest)WebRequest.Create(string.Format("https://build.phonegap.com/api/v1/apps/{0}?auth_token={1}", appId, token));
            request.ContentType = "application/zip";
            request.Headers["Content-disposition"] = string.Format("attachment; filename=\"{0}\"", info.Name);
            request.Method = "PUT";

            var reqStream = request.GetRequestStream();
            var file = new FileStream(zipFile, FileMode.Open);
            var bytes = new byte[32768];
            int len = 0;

            while((len = file.Read(bytes, 0, bytes.Length)) > 0)
                reqStream.Write(bytes, 0, len);

            reqStream.Close();
            var response = new StreamReader(request.GetResponse().GetResponseStream());
            string responseText = response.ReadToEnd();
            Console.WriteLine(responseText);
            Console.ReadLine();
        }
    }
}
4

1 回答 1

2

我想到了。我使用 fiddler 从我的应用程序和 cURL 捕获请求,将两者进行比较并进行相应调整。这是我最终得到的代码:

using System;
using System.IO;
using System.Net;

namespace PhoneGapBuildQuestion
{
    class Program
    {
        static void Main(string[] args)
        {
            string appId = "[your appId here]";
            string fileName = "[absolute path to .zip file here]";
            string token = "[authentication token here]";

            string boundry = "----------------------------7b053ae48e94";
            var encoding = new System.Text.ASCIIEncoding();
            var fileInfo = new FileInfo(fileName);
            var ms = new MemoryStream();
            long totalBytes = 0;

            string txt = string.Format("--{0}{2}Content-Disposition: form-data; name=\"file\"; filename=\"{1}\"{2}Content-Type: application/octet-stream{2}{2}", boundry, fileInfo.Name, Environment.NewLine);
            int bytesRead = 0;
            var buffer = new byte[32768];

            bytesRead = encoding.GetBytes(txt, 0, txt.Length, buffer, 0);
            totalBytes += bytesRead;
            ms.Write(buffer, 0, bytesRead);

            // read/write file contents to the stream
            var fs = new FileStream(fileName, FileMode.Open);
            while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
            {
                ms.Write(buffer, 0, bytesRead);
                totalBytes += bytesRead;
            }

            txt = Environment.NewLine + "--" + boundry + "--" + Environment.NewLine;
            bytesRead = encoding.GetBytes(txt, 0, txt.Length, buffer, 0);
            totalBytes += bytesRead;
            ms.Write(buffer, 0, bytesRead);
            ms.Position = 0;

            var request = (HttpWebRequest)WebRequest.Create(string.Format("https://build.phonegap.com/api/v1/apps/{0}?auth_token={1}", appId, token));
            request.ContentLength = totalBytes;
            request.Method = "PUT";
            request.ContentType = "multipart/form-data; boundary=" + boundry;
            var requestStream = request.GetRequestStream();

            while ((bytesRead = ms.Read(buffer, 0, buffer.Length)) > 0)
                requestStream.Write(buffer, 0, bytesRead);

            requestStream.Close();

            Console.WriteLine(new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd());
            Console.ReadLine();
        }
    }
}
于 2013-05-23T21:24:02.197 回答