C# 如何通过Flurl MultipartFormDataContent向BIM 360字段发布附件

C# 如何通过Flurl MultipartFormDataContent向BIM 360字段发布附件,c#,.net,multipartform-data,flurl,autodesk-bim360,C#,.net,Multipartform Data,Flurl,Autodesk Bim360,我正试图通过应用程序(.NET framework)在BIM 360字段中上传一个问题的附件。我正在使用以下端点(BIM 360现场API文档:) 为了构建请求,我使用了Flurl和MultipartFormDataContent(请参见下面的代码)。然而,我得到了一个500内部服务器错误,不幸的是,没有更具体的信息来说明到底出了什么问题 我试图通过邮递员上传一个完全相同的url、勾号、项目id和“附件详细信息字符串”的附件,效果很好 代码: byte[] fileByteArray = mem

我正试图通过应用程序(.NET framework)在BIM 360字段中上传一个问题的附件。我正在使用以下端点(BIM 360现场API文档:)

为了构建请求,我使用了FlurlMultipartFormDataContent(请参见下面的代码)。然而,我得到了一个500内部服务器错误,不幸的是,没有更具体的信息来说明到底出了什么问题

我试图通过邮递员上传一个完全相同的url、勾号、项目id和“附件详细信息字符串”的附件,效果很好

代码:

byte[] fileByteArray = memoryStream.ToArray();
string attachment = JsonConvert.SerializeObject(attachmentDetails);

MultipartFormDataContent conntent = new MultipartFormDataContent();
conntent.Add(new ByteArrayContent(fileByteArray, 0, fileByteArray.Length), "original");
conntent.Add(new StringContent(attachment), "attachment");

FlurlClient client = fieldConnection.GetClient("attachments");
client.Url.SetQueryParam("ticket", Ticket);
client.Url.SetQueryParam("project_id", project);

return await client
             .WithTimeout(30)
             .SendAsync(HttpMethod.Post, conntent)
             .ConfigureAwait(false);
我的MultipartFormDataContent可能有问题。 我错过什么了吗

致意


Chris

这似乎是Flurl库()的一个问题,并且总是无法发布正确的内容。不管怎样,这里有一个用于玩Flurl的工作代码段。希望有帮助

顺便说一句,

此API是经典BIM360字段的一部分,而不是Forge平台的一部分。因此,请将您的问题发布到,谢谢

publicstatichttpresponsemessageattachmentsbyflur(字符串票据、字符串项目标识、,
字符串原始路径、字符串拇指路径、,
字符串容器(id,字符串容器类型)
{
//撰写附件JSON字符串
FileInfo original=新的FileInfo(originalPath);
字典att=新字典();
//日期时间格式:“2015-08-05 15:28:17-0500”;
字符串dateTimeFormat=“yyyy-MM-dd HH:MM:ss-zzz”;
字符串curTime=DateTime.Now.ToString(dateTimeFormat);
att[“fcreate_date”]=original.CreationTime.ToString(dateTimeFormat);
att[“fmod_date”]=原始.LastWriteTime.ToString(日期时间格式);
att[“创建时间”]=缩短时间;
att[“更新时间”]=缩短时间;
att[“size”]=原始.Length.ToString();
att[“content_type”]=MimeMapping.GetMimeMapping(original.Name);
att[“filename”]=原始的.Name;
att[“container\u id”]=container\u id;//例如,issue\u id
att[“容器类型”]=容器类型;//例如,“问题”
//转换为JSON格式
string attachment=Newtonsoft.Json.JsonConvert.SerializeObject(att);
var mpc=新的MultipartContent();
var ticketContent=新的StringContent(票据);
ticketContent.Headers.Add(“内容处置”,“表单数据;名称=\“ticket\”);
mpc.Add(票务内容);
var projectdcontent=新的StringContent(项目id);
projectdContent.Headers.Add(“内容处置”,“表单数据;名称=\“项目id\”);
mpc.Add(项目内容);
var attachmentContent=newstringcontent(附件,Encoding.UTF8,“application/json”);
attachmentContent.Headers.Add(“内容处置”,“表单数据;名称=\”附件\“);
mpc.Add(附件内容);
var attachmentFileStream=File.OpenRead(originalPath);
var attachmentContentStream=新的StreamContent(attachmentFileStream);
attachmentContentStream.Headers.Add(“内容处置”,string.Format(“表单数据;名称=\“原始\”;文件名=\“{0}\”,路径.GetFileName(原始路径)));
添加(附件ContentStream);
如果(!string.IsNullOrEmpty(thumbPath))
{
var thumbFileStream=File.OpenRead(thumbPath);
var thumbContentStream=新的StreamContent(thumbFileStream);
thumbContentStream.Headers.Add(“内容处置”,string.Format(“表单数据;名称=\“thumb\”文件名=\“{0}\”,Path.GetFileName(thumbPath)));
mpc.Add(thumbContentStream);
}
变量url=”https://bim360field.autodesk.com/api/attachments";
var resp=url
.PostAsync(mpc)
.结果;
返回响应;
}

请尽可能多地发布关于邮递员成功上传的详细信息。截图很好。我们只想验证URL参数与请求体之间到底是什么,以及在成功的情况下它是如何格式化的(多部分等)。
 public static HttpResponseMessage AttachmentsByFlurl(string ticket, string project_id,
            string originalPath, string thumbPath,
            string container_id, string container_type)
        {
            // Compose Attachment JSON string 
            FileInfo original = new FileInfo(originalPath);
            Dictionary<string, string> att = new Dictionary<string, string>();

            // date time format: "2015-08-05 15:28:17 -0500";
            string dateTimeFormat = "yyyy-MM-dd HH:mm:ss zzz";
            string curTime = DateTime.Now.ToString(dateTimeFormat);
            att["fcreate_date"] = original.CreationTime.ToString(dateTimeFormat);
            att["fmod_date"] = original.LastWriteTime.ToString(dateTimeFormat);
            att["created_at"] = curTime;
            att["updated_at"] = curTime;

            att["size"] = original.Length.ToString();
            att["content_type"] = MimeMapping.GetMimeMapping(original.Name);
            att["filename"] = original.Name;
            att["container_id"] = container_id;     // e.g., issue_id 
            att["container_type"] = container_type; // e.g., "Issue" 

            // Conver to JSON format
            string attachment = Newtonsoft.Json.JsonConvert.SerializeObject(att);

            var mpc = new MultipartContent();
            var ticketContent = new StringContent(ticket);
            ticketContent.Headers.Add("Content-Disposition", "form-data; name=\"ticket\"");
            mpc.Add(ticketContent);

            var projectIdContent = new StringContent(project_id);
            projectIdContent.Headers.Add("Content-Disposition", "form-data; name=\"project_id\"");
            mpc.Add(projectIdContent);

            var attachmentContent = new StringContent(attachment, Encoding.UTF8, "application/json");
            attachmentContent.Headers.Add("Content-Disposition", "form-data; name=\"attachment\"");
            mpc.Add(attachmentContent);

            var attachmentFileStream = File.OpenRead(originalPath);
            var attachmentContentStream = new StreamContent(attachmentFileStream);
            attachmentContentStream.Headers.Add("Content-Disposition", string.Format("form-data; name=\"original\"; filename=\"{0}\"", Path.GetFileName(originalPath)));
            mpc.Add(attachmentContentStream);

            if(!string.IsNullOrEmpty(thumbPath))
            {
                var thumbFileStream = File.OpenRead(thumbPath);
                var thumbContentStream = new StreamContent(thumbFileStream);
                thumbContentStream.Headers.Add("Content-Disposition", string.Format("form-data; name=\"thumb\"; filename=\"{0}\"", Path.GetFileName(thumbPath)));
                mpc.Add(thumbContentStream);
            }

            var url = "https://bim360field.autodesk.com/api/attachments";
            var resp = url
                        .PostAsync(mpc)
                        .Result;

            return resp;
        }