Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebRequest.GetResponse等待完成_C#_Asp.net_Openstreetmap - Fatal编程技术网

C# WebRequest.GetResponse等待完成

C# WebRequest.GetResponse等待完成,c#,asp.net,openstreetmap,C#,Asp.net,Openstreetmap,我正在用C编写一个ASP.NET服务器,它需要从外部服务器获取一组图像。我遇到的问题是,图像是从我的方法返回的,但看起来它们只加载了一半 这是通过我的服务器加载时磁贴的外观(它是OSM循环映射磁贴): 如果我在浏览器中打开互动程序(当然是从同一个URL),它就是这个样子: 我很清楚,所有的字节都没有通过网络传输,但我不确定它们在哪里丢失了。这就是我的代码的样子: private byte[] GetTile(string url) { var response = WebReques

我正在用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;
}

这样做也不太合适。我的字节要去哪里?在我从函数返回之前,是否有一种建议的方法来等待服务器的所有字节到达?

我只是重复Jon Skeet的答案,因为它直接适用于您的问题

也许如果有人搜索类似的关键词,这个答案可以为他们指明正确的方向。你不是第一个,也绝对不会是最后一个有这个问题的人

Stream.Read()。您需要确保检查返回值以绝对确定整个流已被消耗:

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();
    }
}

我只是照搬Jon Skeet的答案,因为它直接适用于你的问题

也许如果有人搜索类似的关键词,这个答案可以为他们指明正确的方向。你不是第一个,也绝对不会是最后一个有这个问题的人

Stream.Read()。您需要确保检查返回值以绝对确定整个流已被消耗:

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();
    }
}
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();
}
你也可以用这个

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();
}
你也可以用这个


Jon Skeet有一个答案这里有一个解释:Jon Skeet有一个答案这里有一个解释:我选择WebClient解决方案,只是因为它更干净。谢谢我选择WebClient解决方案,只是因为它更干净。谢谢