[英]WebRequest.GetResponse Wait For Completion
我正在用C#編寫ASP.NET服務器,需要從外部服務器獲取一堆圖像。 我遇到的問題是圖像是從我的方法中返回的,但是看起來它們只有一半被加載。
這是通過我的服務器加載后的圖塊的樣子(這是OSM周期圖圖塊):
這就是如果我只是在瀏覽器中打開它的樣子(當然是從相同的URL):
對我來說很明顯,並不是所有字節都通過網絡傳輸,但是我不確定它們在哪里丟失。 這是我的代碼如下所示:
private byte[] GetTile(string url)
{
var response = WebRequest.Create(url).GetResponse();
Stream respStr = response.GetResponseStream();
byte[] buf = new byte[response.ContentLength];
respStr.Read(buf, 0, buf.Length);
return buf;
}
這也不是正確的方法。 我的字節要去哪里? 有沒有建議的方法,等待我從函數返回之前,等待服務器中的所有字節到達?
respStr.Read(buf, 0, buf.Length);
讀取並不能保證它將讀取buf.Length
字節。 您應該檢查其返回值。 或者,您可以使用CopyTo
將其復制到另一個流中
private byte[] GetTile(string url)
{
var response = WebRequest.Create(url).GetResponse();
Stream respStr = response.GetResponseStream();
MemoryStream m = new MemoryStream();
respStr.CopyTo(m);
return m.ToArray();
}
您也可以為此使用WebClient
private byte[] GetTile(string url)
{
using (WebClient wc = new WebClient())
{
return wc.DownloadData(url);
}
}
我只是模仿喬恩·斯凱特(Jon Skeet)的答案,因為它直接適用於您的問題。 從流創建字節數組
也許如果有人搜索相似的關鍵字,此答案可以為他們指明正確的方向。 您不是第一個出現此問題的人,也絕對不會是最后一個遇到此問題的人。
Stream.Read()
方法不能保證將在Stream中讀取所有字節,這在引用網絡流時尤其明顯。 您需要確保檢查返回值,以確保完全消耗了整個流:
public static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16*1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.