C#HttpClient文件流内容错误边界头

C#HttpClient文件流内容错误边界头,c#,html,http,post,http-headers,C#,Html,Http,Post,Http Headers,我正试图模拟HTTP post文件,就像浏览器(chrome)所做的那样: HTML: <form name="fnup" method="post" action="action.shtml" enctype="multipart/form-data"> <input name="firmfile" id="firmfile" type="file"> <input type="submit" id="firmbutto

我正试图模拟HTTP post文件,就像浏览器(chrome)所做的那样:

HTML

<form name="fnup" method="post" action="action.shtml" enctype="multipart/form-data">    
         <input name="firmfile" id="firmfile" type="file">
         <input type="submit" id="firmbutton" value="Upgrade" class="othsave">
</form>
     public async Task<string> UploadFile(string actionUrl, string filePath)
            {
                var httpClient = new HttpClient();
                //Should I need to add all those headers??? it will help me? what is necessary?
                httpClient.DefaultRequestHeaders.Add("Upgrade-Insecure-Requests", "1");
                httpClient.DefaultRequestHeaders.Add("Origin", "http://" + ip);
                httpClient.DefaultRequestHeaders.Add("Upgrade-Insecure-Requests", "1");
                httpClient.DefaultRequestHeaders.Add("Pragma", "no-cache");
                httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36");
                httpClient.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
                httpClient.DefaultRequestHeaders.Add("Referer", "http://" + ip + "/");
                httpClient.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate");
                httpClient.DefaultRequestHeaders.Add("Accept-Language", "he,en-US;q=0.9,en;q=0.8");
                httpClient.DefaultRequestHeaders.Add("Cookie", "page=DevSet");
                FileStream paramFileStream = File.OpenRead(filePath);
                HttpContent fileStreamContent = new StreamContent(paramFileStream);
                using (var content = new MultipartFormDataContent())
                {
                    content.Add(fileStreamContent, "firmfile", Path.GetFileName(filePath));
                    HttpResponseMessage response = await httpClient.PostAsync(actionUrl, content);

                    string res = await response.Content.ReadAsStringAsync();
                    return await Task.Run(() => res);
                }
            }

C#

<form name="fnup" method="post" action="action.shtml" enctype="multipart/form-data">    
         <input name="firmfile" id="firmfile" type="file">
         <input type="submit" id="firmbutton" value="Upgrade" class="othsave">
</form>
     public async Task<string> UploadFile(string actionUrl, string filePath)
            {
                var httpClient = new HttpClient();
                //Should I need to add all those headers??? it will help me? what is necessary?
                httpClient.DefaultRequestHeaders.Add("Upgrade-Insecure-Requests", "1");
                httpClient.DefaultRequestHeaders.Add("Origin", "http://" + ip);
                httpClient.DefaultRequestHeaders.Add("Upgrade-Insecure-Requests", "1");
                httpClient.DefaultRequestHeaders.Add("Pragma", "no-cache");
                httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36");
                httpClient.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
                httpClient.DefaultRequestHeaders.Add("Referer", "http://" + ip + "/");
                httpClient.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate");
                httpClient.DefaultRequestHeaders.Add("Accept-Language", "he,en-US;q=0.9,en;q=0.8");
                httpClient.DefaultRequestHeaders.Add("Cookie", "page=DevSet");
                FileStream paramFileStream = File.OpenRead(filePath);
                HttpContent fileStreamContent = new StreamContent(paramFileStream);
                using (var content = new MultipartFormDataContent())
                {
                    content.Add(fileStreamContent, "firmfile", Path.GetFileName(filePath));
                    HttpResponseMessage response = await httpClient.PostAsync(actionUrl, content);

                    string res = await response.Content.ReadAsStringAsync();
                    return await Task.Run(() => res);
                }
            }
公共异步任务上载文件(字符串actionUrl、字符串文件路径)
{
var httpClient=新的httpClient();
//我需要添加所有这些标题吗???这将帮助我吗?需要什么?
httpClient.DefaultRequestHeaders.Add(“升级不安全请求”,“1”);
httpClient.DefaultRequestHeaders.Add(“来源”,“http://”+ip);
httpClient.DefaultRequestHeaders.Add(“升级不安全请求”,“1”);
httpClient.DefaultRequestHeaders.Add(“Pragma”,“无缓存”);
httpClient.DefaultRequestHeaders.Add(“用户代理”、“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/65.0.3325.181 Safari/537.36”);
httpClient.DefaultRequestHeaders.Add(“接受”,“文本/html,应用程序/xhtml+xml,应用程序/xml;q=0.9,image/webp,image/apng,*/*;q=0.8”);
httpClient.DefaultRequestHeaders.Add(“Referer”,“http://“+ip+”/”);
添加(“接受编码”、“gzip、deflate”);
httpClient.DefaultRequestHeaders.Add(“接受语言”,“他,en-US;q=0.9,en;q=0.8”);
httpClient.DefaultRequestHeaders.Add(“Cookie”,“page=DevSet”);
FileStream paramFileStream=File.OpenRead(filePath);
HttpContent fileStreamContent=新的流内容(paramFileStream);
使用(var content=new MultipartFormDataContent())
{
Add(fileStreamContent,“firmfile”,Path.GetFileName(filePath));
HttpResponseMessage response=等待httpClient.PostAsync(actionUrl,内容);
string res=wait response.Content.ReadAsStringAsync();
返回等待任务。运行(()=>res);
}
}
C#示例在我的服务器中不起作用,我无法理解为什么

在看过Wireshark之后,我看到了一些不同之处:

铬合金

C#

问题:

1) 如何从
内容配置中删除
“filename*=utf-8”VP445\u all\u V116.bin“
2) 为什么我在Chrome中看不到第二行内容类型:应用程序/八位字节流 3) 内容长度也不相同(即使是同一个文件)
4) 底线是C#不工作,chrome也在工作,服务器端对我来说是一个黑匣子,所以我需要在这里猜测我在C#post请求中做错了什么

找到了解决办法

问题确实是
“内容类型:应用程序/八位字节流”

为什么不自动添加
HttpClient
StreamContent
?我真的不知道

解决方法是手动添加到它的

主要思想如下:

以下是正确的C#代码:

公共异步任务上载文件(字符串actionUrl、字符串文件路径)
{
var httpClient=新的httpClient();
httpClient.Timeout=TimeSpan.fromMillimes(FileReqTimeout);
FileStream FileStream=File.OpenRead(filePath);
var streamContent=新的streamContent(fileStream);
streamContent.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“表单数据”);
streamContent.Headers.ContentDisposition.Name=“\”firmfile\”;
streamContent.Headers.ContentDisposition.FileName=“\”+Path.GetFileName(filePath)+“\”;
streamContent.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/八位字节流”);
字符串边界=Guid.NewGuid().ToString();
var内容=新的MultipartFormDataContent(边界);
content.Headers.Remove(“内容类型”);
content.Headers.TryAddWithoutValidation(“内容类型”、“多部分/表单数据;边界=“+boundary”);
content.Add(streamContent);
HttpResponseMessage响应=null;
尝试
{
response=wait-httpClient.PostAsync(actionUrl、内容、cts.Token);
}
捕获(WebException ex)
{
//处理web异常
返回null;
}
捕获(TaskCanceledException ex)
{
if(例如CancellationToken==cts.Token)
{
//真正的取消,由呼叫方触发
返回null;
}
其他的
{
//web请求超时(可能还有其他原因!)
返回null;
}
}
尝试
{
response.EnsureSuccessStatusCode();
}
捕获(例外)
{
返回null;
};
string res=wait response.Content.ReadAsStringAsync();
返回等待任务。运行(()=>res);
}
}

tnx。非常有用