POST 将 JSON 字符串与文件一起传递后结果为空

POST result empty after passing a JSON string along with a file

我在上传文件(此示例的图像)以及 JSON 字符串时遇到问题。我作为客户端,试图上传到网络服务器。目前在网站上,上传文件时,有效载荷是这样的:

------WebKitFormBoundary1A4Toq4hnrayCRu4
Content-Disposition: form-data; name="FileInstance"

{"action":["/public/my_folder"],"fileName":"download_icon.png","fileSize":313,"certification":{"level":"0","Groups":[]}}

------WebKitFormBoundary1A4Toq4hnrayCRu4
Content-Disposition: form-data; name="download_icon.png"; filename="download_icon.png"
Content-Type: image/png


------WebKitFormBoundary1A4Toq4hnrayCRu4--

我通过 2 个单独的请求发布,每个结果都有一个 200 状态代码,但查看结果,它是空的,我应该收到上传文件的 md5hash,但我没有。

这是我的代码:

// Uploading the JSON first
MultipartFormDataContent form = new MultipartFormDataContent();
var boundary = $"----WebKitFormBoundary" + DateTime.Now.Ticks.ToString("x");
form.Headers.Remove("Content-Type");
form.Headers.Add("Content-Type", $"multipart/form-data; boundary={boundary}");
MyFileClass currentFile = new MyFileClass();
currentFile.action = new List<string>() { "/public/my_folder" };
currentFile.filename = Path.GetFileName(Filename);

currentFile.fileSize = Convert.ToInt32(new FileInfo(Filename).Length);

currentFile.certification= new MyFileClass.Certification();
CreateCertification(currentFile.certification);

var json = JsonConvert.SerializeObject(currentFile);
HttpContent content = new StringContent(json, Encoding.UTF8, "application/json");
content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
     Name = Path.GetFileName(Filename),
     FileName = Path.GetFileName(Filename)
};
var response = await myHttpClient.PostAsync(url, form);
var result_str = response.Content.ReadAsStringAsync().Result;

// Uploading the actual file

var stream = new FileStream(Filename, FileMode.Open);
form = new MultipartFormDataContent();
boundary = $"----WebKitFormBoundary" + DateTime.Now.Ticks.ToString("x");
form.Headers.Remove("Content-Type");
form.Headers.Add("Content-Type", $"multipart/form-data; boundary={boundary}");
content = new StreamContent(stream);
content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
     {
          Name = "FileInstance"
     };
content = new StreamContent(stream);
form.Add(content, Path.GetFileNameWithoutExtension(Filename));

response = await myHttpClient.PostAsync(url, form);
result_str = response.Content.ReadAsStringAsync().Result;

编辑 1:httpclient 是这样定义的:

string password = SecureStringExtensions.ToUnsecuredString(Password);
var credCache = new CredentialCache
{
     { 
          new Uri(url), "Basic", new NetworkCredential(Username, password) 
     }
};

var myHttpClient = new HttpClient(new HttpClientHandler() { Credentials = credCache });
myHttpClient.DefaultRequestHeaders.Add("Connection", "keep-alive");
myHttpClient.Timeout = Timeout.InfiniteTimeSpan;

我尝试了不同的 POST 方法,但均无效。现在我找到了一个解决方案,我删除了对边界和 ContentType 的编辑,并直接将文件和 JSON 同时添加到 MultipartFormDataContent 并且工作正常。

MyFileClass currentFile = new MyFileClass();
currentFile.action = new List<string>() { "/public/my_folder" };
currentFile.filename = Path.GetFileName(Filename);

currentFile.fileSize = Convert.ToInt32(new FileInfo(Filename).Length);

currentFile.certification= new MyFileClass.Certification();
CreateCertification(currentFile.certification);

var json = JsonConvert.SerializeObject(currentFile);

var formContent = new MultipartFormDataContent
{
     { new StringContent(json, Encoding.UTF8, "application/json") },
     { new StreamContent(new MemoryStream(File.ReadAllBytes(Filename))), Path.GetFileName(Filename) ,Path.GetFileName(Filename)}
};

var response = await myHttpClient.PostAsync(url, formContent);
string stringContent = await response.Content.ReadAsStringAsync();

其中文件名是文件本身的绝对路径。