HttpContent 注意事項

HttpContent 注意事項

調用 HttpContent ReadAsStreamAsync 方法時,所傳回的 Stream 個體是存放於 HttpContent 的私有欄位 contentReadStream如果對這個 Stream 個體進行讀取或 Dispose 的話,將會影響下一個存取此 Stream 個體的使用狀況。

 

  • 舉例

var reader = new StreamReader(stream);
var content = reader.ReadToEnd();
reader.Dispose(); //不可以, 因為會間接對 stream 調用 Close 方法。
stream.Position = 0; //必須, 復歸讀取位置, 因為 HttpContent 永遠只保留同一個 Stream 個體。
  1. 上述例子,按照習慣,我們會在用完StreamReader後會將其 Dispose (或用 using 包起來),這就會間接的對stream調用Close方法。
  2. 註:HttpContent只有判斷contentReadStream == null時才會建立新的MemoryStream個體再指派給contentReadStream。

  3. 上述例子,如果我們對stream進行了讀取的操作,則結束後必須將其讀取位置復原,以利後面的user能順利使用。

 

  • 替代作法

如果我們要取得的是字串,我們可以直接調用ReadAsStringAsync來獲得結果,這個方法不會影響contentReadStream的狀態。

註:ReadAsStringAsync方法會用content-type的charset來解讀內容。