尝试将POST示例复制到C#

尝试将POST示例复制到C#,c#,http,C#,Http,我尝试使用POST将文件上传到FlashAir卡。有一个JavaScript示例可以在我的机器上使用: cgi="http://flashair/upload.cgi"; $.ajax({ url: cgi, type: "POST", data: fd, processData: false, contentType: false, success: function(h

我尝试使用POST将文件上传到FlashAir卡。有一个JavaScript示例可以在我的机器上使用:

cgi="http://flashair/upload.cgi";

 $.ajax({ url: cgi,
            type: "POST",
            data: fd,
            processData: false,
            contentType: false,
            success: function(html){
                if ( html.indexOf("SUCCESS") ) {
                    alert("success");
                    getFileList(".");
                }else{
                    alert("error");
                }
            }
        });
我试图用.NET实现同样的目标。这就是我所做的:

var cgi="http://flashair/upload.cgi";
byte[] bytes = File.ReadAllBytes(filename);
HttpContent bytesContent = new ByteArrayContent(fileData);

using (var client = new HttpClient())
{
    using (var formData = new MultipartFormDataContent())
    {
        formData.Add(bytesContent, "file");
        var response = client.PostAsync(command, formData).Result;
        if (!response.IsSuccessStatusCode)
        {
            return false;
        }       
        return true; 
    }
}
虽然第一个示例有效,但我的C#变量也返回200代码(这需要一段时间,让我觉得文件正在上载),但文件没有保存


你知道这两个例子的区别在哪里吗?这两个例子可能会导致这个问题。

菲德勒给了我正确的方向。JS和C#变体之间的一个区别是标题

Expect: 100-continue
它只出现在.NET变体上。这不容易移除。事实上,其他答案的提示在这里使用

System.Net.ServicePointManager.Expect100Continue = false;
使用HttpClient时似乎没有任何效果。因此,我决定使用此代码的修改版本:

只需添加以下行:

HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
wr.ServicePoint.Expect100Continue = false;

这导致Expect-100头被删除,文件上载成功。

您可以使用Fiddler检查两个POST请求,并查看它们之间的差异