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 個體。- 上述例子,按照習慣,我們會在用完StreamReader後會將其 Dispose (或用 using 包起來),這就會間接的對stream調用Close方法。
- 上述例子,如果我們對stream進行了讀取的操作,則結束後必須將其讀取位置復原,以利後面的user能順利使用。
註:HttpContent只有判斷contentReadStream == null時才會建立新的MemoryStream個體再指派給contentReadStream。
- 替代作法
如果我們要取得的是字串,我們可以直接調用ReadAsStringAsync來獲得結果,這個方法不會影響contentReadStream的狀態。
註:ReadAsStringAsync方法會用content-type的charset來解讀內容。