簡體   English   中英

WebRequest.GetResponse等待完成

[英]WebRequest.GetResponse Wait For Completion

我正在用C#編寫ASP.NET服務器,需要從外部服務器獲取一堆圖像。 我遇到的問題是圖像是從我的方法中返回的,但是看起來它們只有一半被加載。

這是通過我的服務器加載后的圖塊的樣子(這是OSM周期圖圖塊):

tile.png

這就是如果我只是在瀏覽器中打開它的樣子(當然是從相同的URL):

5.png

對我來說很明顯,並不是所有字節都通過網絡傳輸,但是我不確定它們在哪里丟失。 這是我的代碼如下所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM