Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用C#HttpClient上载文件,邮递员正常工作_C#_Postman_Httpclient_Imanage - Fatal编程技术网

无法使用C#HttpClient上载文件,邮递员正常工作

无法使用C#HttpClient上载文件,邮递员正常工作,c#,postman,httpclient,imanage,C#,Postman,Httpclient,Imanage,我试图将一个文件发布到iManager服务器REST接口(Apache服务器,java后端??不确定)。Postman工作得很好,但当我从C#.NET CORE 3.1尝试它时,我得到如下响应: { “错误”:{ “代码”:“文件上载失败”, “消息”:“文件上载失败” } } 有人有什么想法我可以试试吗?谢谢 <PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> u

我试图将一个文件发布到iManager服务器REST接口(Apache服务器,java后端??不确定)。Postman工作得很好,但当我从C#.NET CORE 3.1尝试它时,我得到如下响应:

{ “错误”:{ “代码”:“文件上载失败”, “消息”:“文件上载失败” } }

有人有什么想法我可以试试吗?谢谢

<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"
                                //  }
                                //}
                            }
                        }
                    }
                }
            }
        }
    }
}

使用Newtonsoft.Json;
使用制度;
使用System.Net.Http;
使用System.IO;
使用系统文本;
使用System.Net.Http.Header;
使用System.Threading.Tasks;
名称空间控制台EAPP1
{
班级计划
{
静态异步任务主(字符串[]args)
{
Uri url=新的Uri(“https://iManageServer.net/");
字符串文件名=@“C:\Temp\Temp.txt”;
字符串标记=“e4vt1dzxcnkqtmouspn6tg6klr7tclcppjvhsu9trlkvnd9go4xtpyeyy0+Lu”;
常量字符串folderId=“MyFolderId”;
使用(FileStream fs=newfilestream(文件名,FileMode.Open,FileAccess.Read,FileShare.ReadWrite))
{
使用(var content=newmultipartformdatacontent($“{DateTime.Now.Ticks:x}”))
{
var jsonString=JsonConvert.SerializeObject(新的{warnings\u for_required\u和{u disabled\u fields=true,doc\u profile=new{name=Path.GetFileNameWithoutExtension(filename),extension=Path.GetExtension(filename).TrimStart('.',size=fs.Length});
HttpContent HttpContent=新的StringContent(jsonString,Encoding.UTF8);
httpContent.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/json”);
var c1=HTTPC含量;
添加(c1,“\”json\”);
var c2=新流量含量(fs);
c2.Headers.ContentType=新的MediaTypeHeaderValue(“文本/普通”);
添加(c2,“\”文件“);
c2.Headers.ContentDisposition.FileName=$“\”{FileName}\”;
c2.Headers.ContentDisposition.FileNameStar=null;
var hch=新的HttpClientHandler();
hch.ServerCertificateCustomValidationCallback+=(发件人、证书、链、错误)=>true;
使用(var httpClient=newhttpclient(hch){BaseAddress=url})
{
httpClient.DefaultRequestHeaders.Add(“用户代理”、“PostmanRuntime/7.26.5”);
httpClient.DefaultRequestHeaders.Add(“接受”,“*/*”);
httpClient.DefaultRequestHeaders.Add(“连接”,“保持活动”);
使用(var requestMessage=newhttprequestmessage(HttpMethod.Post,$“folders/{folderId}/documents”))
{
添加(“X-Auth-Token”,Token);
requestMessage.Content=内容;
var response=wait-httpClient.sendsync(requestMessage);
字符串jsonResponse=await response.Content.ReadAsStringAsync();
if(响应。IsSuccessStatusCode)
{
//从不击中
}
其他的
{
System.Diagnostics.Debug.WriteLine(jsonResponse);
//{
//“错误”:{
//“代码”:“文件上载失败”,
//“消息”:“文件上载失败”
//  }
//}
}
}
}
}
}
}
}
}
邮递员工作很好。以下是两种情况下Wireshark跟踪的外观:

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


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

var boundary = $"-------------------------{DateTime.Now.Ticks:x}";
content.Headers.Remove("Content-Type");
content.Headers.TryAddWithoutValidation("Content-Type", $"multipart/form-data; boundary={boundary}");
content.GetType().BaseType.GetField("_boundary", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(content, boundary);

为什么在C#代码中将“PostmanRuntime”设置为UserAgent?是的,我很绝望,并将其添加到C#类中。我试图让它看起来尽可能精确,但使用(var httpClient=new httpClient(hch)=>这纯粹是一个工作示例。我在实际应用程序中对其进行了完全不同的架构设计。最终结果是相同的。不过,好吧。嗯,看看内容长度有何不同?邮递员518个,C#361个?你尝试过不同的文件还是相同的?我知道。这是最重要的问题解决方案。我知道我们的解决方案是一个简单的周末和周末计划。主要承租人je vais rechercher Pourqoi le serveur d'iManage Faith une Errer s'il y a des marques de Quotes Auto de Quoter le s séparapter。我的需求是关于这个问题的一般性讨论,没有具体参考e to iManager:设置私有字段的行是多余的。我对它进行了注释,您的解决方案仍然有效。我使用的是.NET Framework,因此在.Core.Yep上可能需要私有字段设置程序。这是.NET Core。我尝试过不使用私有字段设置程序,但它失败了。