2011-01-20 78 views
0

我目前正在努力實現向WCF REST服務的文件上載。發送到WCF REST服務的數據不會轉到流輸入參數

客戶端執行以下操作:

void uploadFile(string serverUrl, string filePath) 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest. 
     Create(serverUrl); 
    request.Method = "POST"; 
    request.ContentType = "multipart/form-data"; 
    request.SendChunked = true; 
    request.Timeout = 60000; 
    request.KeepAlive = true; 

    using(BinaryReader reader = new BinaryReader( 
     File.OpenRead(filePath))) { 

     request.ContentLength = reader.BaseStream.Length; 
     using(Stream stream = request.GetRequestStream()) { 
      byte[] buffer = new byte[1024]; 
      while(true) { 
       int bytesRead = reader.Read(buffer, 0, buffer.Length); 
       if(bytesRead == 0) { 
        break; 
       } 
       stream.Write(buffer, 0, bytesRead); 
      } 
     } 
    } 

    HttpWebResponse result = (HttpWebResponse)request.GetResponse(); 
    //handle result - not relevant 
} 

其中serverUrl爲 「http://本地主機:/Service1.svc/UploadFile」。

的WCF REST服務具有以下簽名的方法:

[OperationContract] 
[WebInvoke(Method="POST")] 
string UploadFile(System.IO.Stream fileData); 

這是實現如下:

public string UploadFile(System.IO.Stream fileData) 
{ 
    byte[] buffer = new byte[1024]; 
    while(true) { 
     int readAmount = fileData.Read(buffer, 0, buffer.Length); 
     if(readAmount == 0) { 
      break; 
     } 
    } 
    return ""; 
} 

當我啓動服務並運行客戶機代碼將出現以下情況。

客戶端啓動while循環,控件進入服務方法,服務器啓動while循環。服務器上的Read返回零,控件通過服務器方法返回。同時,客戶端嘗試撥打Write() - 「無法將數據寫入傳輸連接:現有連接被遠程主機強行關閉」。

對我來說,它看起來像我試圖流入請求的文件數據只是沒有映射到服務器方法參數。我究竟做錯了什麼?

回答

0

可能嘗試不同的內容類型? 「application/octet-stream」

該代碼看起來很適合我。客戶端部分是讀取整個文件還是有問題?先測試一下。使用fiddler來查看實際通過電話連接到服務的內容。

如果客戶可以在整個文件到緩衝區中讀取,再試一次

request.Write(entireFileBuffer,0,entireFileLength)發送這一切; request.close();

而不是分塊。

+0

我嘗試了所有這一切,但沒有多大幫助。沒有Fiddler它不起作用,客戶端現在拋出一個異常「底層連接已關閉:接收發生意外錯誤」,請求到達服務器並且服務器行爲與以前相同。使用Fiddler,我在客戶端上獲得HTTP 502 Bad Gateway,並且請求沒有到達服務器,請求在提琴手中看起來合理。 – sharptooth 2011-01-21 13:57:27