无法使用C#HttpClient上传文件,Postman工作正常

问题描述

我正在尝试将文件发布到iManage服务器REST接口(Apache服务器,java后端?不确定)。邮递员工作正常,但是当我从C#.NET CORE 3.1尝试时,我得到的响应是这样的:

{ “错误”:{ “ code”:“ FileUploadFailure”, “消息”:“文件上传失败” } }

有人有什么可以尝试的想法吗?谢谢!

<packagereference Include="Newtonsoft.Json" Version="12.0.3" />


using Newtonsoft.Json;
using System;
using System.Net.Http;
using System.IO;
using System.Text;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Uri url = new Uri("https://iManageServer.net/");
            string filename = @"C:\Temp\temp.txt";
            string token = "E4vt1DzXcnkQTmOUspN6TG6KLR7TClCPPbjyvHsu9TRlKvND9gO4xTPYIEYy0+Lu";
            const string folderId = "MyFolderId";

            using (FileStream fs = new FileStream(filename,FileMode.Open,FileAccess.Read,FileShare.ReadWrite))
            {
                using (var content = new MultipartFormDataContent($"{DateTime.Now.Ticks:x}"))
                {
                    var jsonString = JsonConvert.SerializeObject(new { warnings_for_required_and_disabled_fields = true,doc_profile = new { name = Path.GetFileNameWithoutExtension(filename),extension = Path.GetExtension(filename).Trimstart('.'),size = fs.Length } });
                    HttpContent httpContent = new StringContent(jsonString,Encoding.UTF8);
                    httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                    var c1 = httpContent;
                    content.Add(c1,"\"json\"");

                    var c2 = new StreamContent(fs);
                    c2.Headers.ContentType = new MediaTypeHeaderValue("text/plain");
                    content.Add(c2,"\"file\"");
                    c2.Headers.Contentdisposition.FileName = $"\"{filename}\"";
                    c2.Headers.Contentdisposition.FileNameStar = null;

                    var hch = new httpclienthandler();
                    hch.ServerCertificateCustomValidationCallback += (sender,cert,chain,error) => true;

                    using (var httpClient = new HttpClient(hch) { BaseAddress = url })
                    {
                        httpClient.DefaultRequestHeaders.Add("User-Agent","PostmanRuntime/7.26.5");
                        httpClient.DefaultRequestHeaders.Add("Accept","*/*");
                        httpClient.DefaultRequestHeaders.Add("Connection","keep-alive");

                        using (var requestMessage = new HttpRequestMessage(HttpMethod.Post,$"folders/{folderId}/documents"))
                        {
                            requestMessage.Headers.Add("X-Auth-Token",token);

                            requestMessage.Content = content;
                            var response = await httpClient.SendAsync(requestMessage);

                            string jsonResponse = await response.Content.ReadAsstringAsync();
                            if (response.IsSuccessstatusCode)
                            {
                                //never hits
                            }
                            else
                            {
                                System.Diagnostics.Debug.WriteLine(jsonResponse);

                                //{
                                //  "error": {
                                //    "code": "FileUploadFailure",//    "message": "File upload failure"
                                //  }
                                //}
                            }
                        }
                    }
                }
            }
        }
    }
}

邮递员工作正常。这是Wireshark跟踪的样子:

邮递员是第一位,然后是C#结果:

Postman

C#

解决方法

引用了MultipartFormDataContent的边界。 iManage API不喜欢那样。 我必须在实例化内容之后立即添加以下代码:

databricks