![](/img/trans.png)
[英]C# HttpWebRequest.GetResponse - how is StatusCode usage handled for a non-exception vs webexception response?
[英]How to know the length of Response (HttpWebRequest.GetResponse().GetResponseStream())
我能以任何方式知道響應流的長度,這樣我就可以向用戶顯示下載的百分比進度而不是不確定的進度嗎?
我發現響應看起來像下面,不可尋找,沒有長度
嘗試使用WebResponse.ContentLength
屬性。 如果返回-1,則表示遠程服務器未向您發送響應正文的長度,因此您無法在不完整讀取響應的情況下確定響應的長度。
如果您有興趣,我有一個包含WebHelper類的代碼參考庫。 它類似於WebClient類(包括報告進度的能力),但更靈活。 它存儲在CodePlex上,項目名稱為BizArk 。
它使用Response.ContentLength屬性來確定響應的長度。
ContentLength屬性只是作為服務器標頭的一部分發送。 在某些情況下,服務器可能在發送標頭之前不知道響應的長度。 例如,如果您正在下載動態生成的網頁,並且服務器上的緩沖已關閉。
我解決了創建一個名為WebStreamWithLenght的包裝類(搜索方法未實現,因為我不需要它)
你應該像這樣使用它
WebRequest req = HttpWebRequest.Create(link);
WebResponse res = req.GetResponse();
var stream = res.GetResponseStream();
var streamWithLenght = new WebStreamWithLenght(stream, res.ContentLength);
public class WebStreamWithLenght : Stream
{
long _Lenght;
Stream _Stream;
long _Position;
public WebStreamWithLenght(Stream stream, long lenght)
{
_Stream = stream;
_Lenght = lenght;
}
public override bool CanRead
{
get { return _Stream.CanRead; }
}
public override bool CanSeek
{
get { return true; }
}
public override bool CanWrite
{
get { return _Stream.CanWrite; }
}
public override void Flush()
{
_Stream.Flush();
}
public override long Length
{
get { return _Lenght; }
}
public override long Position { get; set; }
public override int Read(byte[] buffer, int offset, int count)
{
var result = _Stream.Read(buffer, offset, count);
Position += count;
return result;
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotImplementedException();
}
public override void SetLength(long value)
{
_Lenght = value;
}
public override void Write(byte[] buffer, int offset, int count)
{
Write(buffer, offset, count);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.