尝试将POST示例复制到C#

时间:2016-04-25 20:05:10

标签: c# http

我尝试使用POST将文件上传到FlashAir卡。有一个JavaScript-Example可用于我的机器:

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#-Variant也会返回一个200 Code(需要一段时间才能让我想到文件正在上传),但文件没有保存。

知道可能导致问题的两个例子的区别在哪里?

1 个答案:

答案 0 :(得分:0)

小提琴手让我走向了正确的方向。 JS和C#-Variant之间的一个区别是Header

Expect: 100-continue

仅出现在.NET变体上。这不容易删除。事实上,使用

来提示其他答案
System.Net.ServicePointManager.Expect100Continue = false;
使用HttpClient时,

似乎没有任何效果。所以我决定使用此代码的修改版本: https://stackoverflow.com/a/2996904

并添加以下行:

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

这导致删除Expect-100标题并成功上传文件。