C# Google Drive API文件上载错误:“多部分正文中缺少结束边界。”

C# Google Drive API文件上载错误:“多部分正文中缺少结束边界。”,c#,file-upload,google-drive-api,C#,File Upload,Google Drive Api,我试图通过web请求将多部分文件上传到Google,并且我一直在关注如何构造一个有效的多部分文件上传请求,这样我就可以同时发送元数据和实际的文件数据,但是我一直在多部分正文中得到一个缺失的结束边界。当我尝试上传文件时出错,我不知道为什么。我做错了什么 另外,我没有使用驱动器SDK,因为它不适合我的需要 这是我的密码: public bool WriteFileData(Stream data, DSFile file, DSUser user) { v

我试图通过web请求将多部分文件上传到Google,并且我一直在关注如何构造一个有效的多部分文件上传请求,这样我就可以同时发送元数据和实际的文件数据,但是我一直在多部分正文中得到一个缺失的结束边界。当我尝试上传文件时出错,我不知道为什么。我做错了什么

另外,我没有使用驱动器SDK,因为它不适合我的需要

这是我的密码:

 public bool WriteFileData(Stream data, DSFile file, DSUser user)
    {        

        var parent = new Parent();
        var folders = GetUserFolders(user, false);
        DSFolder parentFolder = folders.Where(f => f.FullPath == file.VirtualPath).FirstOrDefault();
        parent.Id = parentFolder.DepositoryFolderId;

        var addFileRequest = new AddFileRequest();
        addFileRequest.Parents.Add(parent);
        addFileRequest.Title = (file.FileName.ToLower().Contains(".ext") == false) ? file.FileName + ".ext" : file.FileName;
        addFileRequest.ModifiedDate = ServiceUtil.ToISO8601(DateTime.Now);
        addFileRequest.MimeType = "application/octet-stream";
        addFileRequest.WritersCanShare = false;
        addFileRequest.Description = file.Description;
        addFileRequest.Labels = new FileLabels();

        byte[] binData = new byte[data.Length];
        data.Read(binData, 0, (int)data.Length);

        string metadata = Microsoft.Http.HttpContentExtensions.CreateJsonDataContract<AddFileRequest>(addFileRequest).ReadAsString();
        string binData64 = Convert.ToBase64String(binData);

        string contentString = "--123ABC Content-Type: application/json; charset=UTF-8 " + metadata;
        contentString += "--123ABC Content-Type: application/octet-stream " + binData64;
        contentString += " --123ABC--";

        HttpResponseMessage response;

        try
        {
            HttpClient client = new HttpClient();
            AddAuthHeader(client, credential.AccessToken);
            client.DefaultHeaders.ContentType = "multipart/related; boundary=\"123ABC\"";
            client.DefaultHeaders.ContentLength = HttpContent.Create(contentString).ReadAsByteArray().Length;
            response = client.Post("https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart", HttpContent.Create(contentString));

            string responseText = response.Content.ReadAsString();
            return false;
        }
        catch (Exception ex)
        {
            return false;
        }
    }
编辑:以下是我对AddFileRequest的定义:

    [DataContract]
    public class AddFileRequest
    {
        [DataMember(Name="title")]
        public string Title { get; set; }
        [DataMember(Name = "labels")]
        public FileLabels Labels { get; set; }
        [DataMember(Name = "mimeType")]
        public string MimeType { get; set; }
        [DataMember(Name = "modifiedDate")]
        public string ModifiedDate { get; set; }
        [DataMember(Name = "parents")]
        public List<Parent> Parents { get; set; }
        [DataMember(Name = "description")]
        public string Description { get; set; }
        [DataMember(Name="writersCanShare")]
        public bool WritersCanShare { get; set; }
   }

找到了解决办法。我决定浏览一下对象浏览器,并注意到System.Net.Http名称空间有一个MultipartFormDataContent类实现了这一点。我以前没有看到它,因为出于某种原因,有两组几乎相同但不兼容的HTTP命名空间:Microsoft.HTTP和System.Net.HTTP。以下是有效的更新代码:

public bool WriteFileData(Stream data, DSFile file, DSUser user)
        {      
            var parent = new Parent();
            var folders = GetUserFolders(user, false);
            DSFolder parentFolder = folders.Where(f => f.FullPath == file.VirtualPath).FirstOrDefault();
            parent.Id = parentFolder.DepositoryFolderId;

            var addFileRequest = new AddFileRequest();
            addFileRequest.Parents.Add(parent);
            addFileRequest.Title = (file.FileName.ToLower().Contains(".ext") == false) ? file.FileName + ".ext" : file.FileName;
            addFileRequest.ModifiedDate = ServiceUtil.ToISO8601(DateTime.Now);
            addFileRequest.MimeType = "application/octet-stream";
            addFileRequest.WritersCanShare = false;
            addFileRequest.Description = file.Description;
            addFileRequest.Labels = new FileLabels();

            string metadata = Microsoft.Http.HttpContentExtensions.CreateJsonDataContract<AddFileRequest>(addFileRequest).ReadAsString();

            var content = new System.Net.Http.MultipartFormDataContent("ABC123");
            content.Add(new System.Net.Http.StringContent(metadata, System.Text.Encoding.UTF8, "application/json"));
            content.Add(new System.Net.Http.StreamContent(data));

            try
            {            
                var client = new System.Net.Http.HttpClient();
                client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", credential.AccessToken);
                var response = client.PostAsync("https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart", content).Result;

                string responseText = response.Content.ReadAsStringAsync().Result;
                return false;
            }
            catch (Exception ex)
            {
                return false;
            }
        }