2015-04-29 101 views
1

我想從C#應用程序閃爍火花核心。我不斷收到{ error: Nothing to do? }的迴應。如何從C#閃爍火花核心#

下面是我的代碼

var url = string.Format("https://api.spark.io/v1/devices/{0}", sparkDeviceID); 

using (var client = new HttpClient()) 
{ 
    client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accesstoken); 
    using (var formData = new MultipartFormDataContent()) 
    { 
     HttpContent fileContent = new ByteArrayContent(Encoding.ASCII.GetBytes(rom)); 
     //client.SendAsync() 
     formData.Add(fileContent, "file", "file"); 
     var response = client.PutAsync(url, formData).Result; 

     if (!response.IsSuccessStatusCode) 
      throw new Exception("An error occurred during rom flash!"); 

     var responseStream = response.Content.ReadAsStreamAsync().Result; 
     using (var reader = new StreamReader(responseStream, true)) 
     { 
      var result = reader.ReadToEnd(); 
     } 
    } 
    return true; 
} 

的文檔讀取:

的API請求應被編碼爲多部分/格式數據與填充的文件字段。

我相信問題是端點沒有看到文件。任何想法如何解決這個問題?

+0

不知道,但我看你使用PutAsync。如果有一個選項(可能存在使用不正確的http動詞的問題),您是否嘗試過PostAsync? – Robert

+1

目標API所需的動詞是PUT。 – drizzie

回答

0

終於搞定了。

問題是.NET爲文件表單數據生成內容處置標頭的方式。

我用小提琴手比較成功的PUT請求PUT請求的輸出,我的代碼是產生:

PUT http://127.0.0.1:8888/ HTTP/1.1 
User-Agent: curl/7.33.0 
Host: 127.0.0.1:8888 
Accept: */* 
Content-Length: 2861 
Expect: 100-continue 
Content-Type: multipart/form-data; boundary=------------------------5efcf64a370f13c8 

--------------------------5efcf64a370f13c8 
Content-Disposition: form-data; name="file"; filename="ms.ino" 
Content-Type: application/octet-stream 

... 

我PUT請求:使用curl產生

成功PUT請求(不成功):

PUT https://api.spark.io/v1/devices/{deviceid} HTTP/1.1 
Authorization: Bearer {access_token} 
Content-Type: multipart/form-data; boundary="135f5425-9342-4ffa-a645-99c04834026f" 
Host: api.spark.io 
Content-Length: 2878 
Expect: 100-continue 

--135f5425-9342-4ffa-a645-99c04834026f 
Content-Type: application/octet-stream 
Content-Disposition: form-data; name=file; filename=file.ino; filename*=utf-8''file.ino 

... 

如果你不會以實際發送的文件內容類型爲準:

成功:Content-Disposition:form-data; NAME = 「文件」; filename =「ms.ino」

不成功:Content-Disposition:form-data;名字=文件;文件名= file.ino; filename * = utf-8''file.ino

最具體而言,該決議是爲name屬性添加引號。

分辨率:

formData.Add(fileContent, "\"file\"", "file.ino");