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