2012-04-25 111 views
3

我成功地創建了一個應用程序,可以將從我的Windows Phone發出的請求發送到以蔚藍色的Web角色託管的WCF api。我使用restful POST方法來使用RestSharp來完成此操作。這一切都非常出色,圖像出現在存儲器中,但圖像不能像普通圖像文件那樣打開。使用RestSharp將圖像上傳到WCF Api - 圖像無效

將它們與我之前上傳的其他圖像進行比較,在元數據信息中,它表示不可查看的圖像具有設置爲「AKEYWqGgulwi6/9/VY2KPg ==」之類的contentMD5字段(而其他圖像可以)是什麼導致文件的問題?

我附上了我的RestSharp代碼,也許我正在添加一些我不應該的東西?我懷疑這個錯誤必須來自這裏,因爲這是圖像流操作的唯一地方。

public void SendRequest(Stream imageStream, string imageID) 
    { 
     var client = new RestClient(); 
     client.BaseUrl = apiAddress; 
     var request = new RestRequest("agerecog/{imageName}", Method.POST); 
     request.AddUrlSegment("imageName", imageID); 

     //convert imagestream to byte array 
     var byteArray = new byte[imageStream.Length]; 
     imageStream.Read(byteArray, 0, (int)imageStream.Length); 

     //add byteArray to request 
     request.AddFile("image/jpeg", byteArray, imageID); 
     var url = client.BuildUri(request).ToString(); 
     client.ExecuteAsync<VizageResponse>(request, response => 
      { 
       //request info. to be added here 
      }); 
    } 

編輯#1 一些工作之後,我決定改變addFile行這樣的:

request.AddFile(null, byteArray, null); 

從而改變流長,也取得了contentMD5字段爲空。但是,圖像仍然不是有效的圖像文件。鑑於我比較的圖像都來自Windows Phone模擬器,它們都應該是一個相同的白色頁面,並且在角落有一個小的黑色方塊 - 但是文件之間的大小不同(有效圖像文件的長度爲5670 ,6076長度爲原來的代碼,並使用上述第二addFile)

EDIT#2 做一些更多的分析,當流被髮送其長度屬性是6116的圖像之前,當它到達在6239長度服務器,但它是6370.我正在從RestSharp方法的某個地方添加264,我相信或者當數據流在服務器端解釋時。 WCF服務代碼:

[WebInvoke(UriTemplate = "/agerecog/{imageName}", Method = "POST")] 
    VizageResult analyseFace(string imageName, Stream imageStream); 
+0

你能把請求和提琴手比較嗎?您可能還希望將AddFile重載直接寫入流。 – 2012-04-25 01:04:43

+0

感謝John,不幸的是我無法使用提琴手,因爲azure服務託管在我的本地開發環境中。然而,我做了一些調查工作,我將添加到上面的編輯中。我將直接寫入流以及 – 2012-04-25 09:06:17

+0

直接流到流沒有出現工作或者不幸 – 2012-04-25 13:05:05

回答

3

問題解決了

我終於解決了這個問題,並且圖像是作爲最終的結果是可見的。發生的情況是,imageStream還包含有關文件名稱的數據,這導致它(保存在Azure中)不會顯示爲圖像文件。

我通過使用這裏找到的MultipartParser類來解決這個問題:http://multipartparser.codeplex.com/在服務器端解析請求到文件名和文件流塊。然後我用正常的過程從這個byte []保存圖像。

我的代碼來解析的WebRequest數據成其組成部分如下發現:

MemoryStream imageStream = new MemoryStream(); 

    MultipartParser parser = new MultipartParser(dataStream); 
     if (parser != null && parser.Success) 
     { 
      imageName = parser.Filename; 
      imageStream.Write(parser.FileContents, 0, parser.FileContents.Length); 
     } 

當您使用內存流記得設置它的位置返回到0 - 一個小學生的錯誤,我做!

+0

但是我應該怎麼做,如果我在linux-machine上有第三方網絡服務?!我認爲這仍然是restSahrp的錯誤。有人知道如何解決HTTP身體只是在發送請求之前的那一刻? – EvgeniyK 2012-11-25 11:50:17

+0

不答覆 - 不知道不幸 – 2012-12-20 10:43:03

0

我對RestSharp不是很熟悉。你能確定MD5是正確的嗎?嘗試將blob中的數據與原始圖像文件中的數據進行比較。例如,檢查它們是否具有相同的大小,第一個/最後幾個字節是否相同(並假定中間的字節也是相同的)。

+0

謝謝,我現在就試着去做。上面我做了一個修改。去嘗試找更多的東西來找到問題的路由原因 – 2012-04-25 09:18:53