我的代码中的这部分引发了异常。我该如何解决这个问题?
XmlDocument locrequest = new XmlDocument();
locrequest.Load(String.Format("http://api.geoips.com/ip/{0}/key/.myapikey./output/xml/", player.IP));
XmlNode root = locrequest.DocumentElement;
string from = root.SelectSingleNode("country_name").InnerText.ToLower();
System.Net.WebException:错误:ConnectFailure(没有足够的缓冲区空间可用)
完整错误http://pastebin.com/8u6MpeWS
编辑:
如果我加
locrequest.XmlResolver = null;
它引发了另一个例外:
System.NullReferenceException:未将对象引用设置为对象的实例
这有什么问题?
答案 0 :(得分:0)
您可以使用WebRequest
类来加载文件
链接:http://msdn.microsoft.com/library/system.net.webrequest.aspx
WebRequest request = WebRequest.Create ("...");
// If required by the server, set the credentials.
request.Credentials = CredentialCache.DefaultCredentials;
// Get the response.
WebResponse response = request.GetResponse ();
// Display the status.
Console.WriteLine (((HttpWebResponse)response).StatusDescription);
// Get the stream containing content returned by the server.
Stream dataStream = response.GetResponseStream ();
.....
答案 1 :(得分:0)
建立在Aghilas的帖子上......
返回的流是不可搜索的流,因此您需要使用类似于以下的函数读取它的末尾:
static byte[] readFullStream(Stream st)
{
Array Buffer = (byte[])Array.CreateInstance(typeof(byte), 32768);
System.Int32 Size;
bool eof = false;
MemoryStream ms = new MemoryStream();
while (!eof)
{
Size = st.Read((byte[])Buffer, 0, Buffer.Length);
if (Size > 0)
{
ms.Write((byte[])Buffer, 0, Size);
}
else
{
eof = true;
}
}
return ms.ToArray();
}
然后,一旦你从上面的函数获得了字节数组,用它加载你的XmlDocument。
请记住,我们从Aghilas代码的底部开始......
byte[] buffer = readFullStream(dataStream);
XmlDocument locrequest = new XmlDocument();
locrequest.LoadXML(new UFT8Encoding().GetString(buffer));
希望这有帮助。
答案 2 :(得分:0)
英戈,
在此问题here的原始帖子的基础上,或许这会更清楚地为您提供各种各样的内容。假设连接失败有更基本的东西,而不仅仅是服务器,无论出于何种原因,不接受连接,你可以绕过XmlDocument类的默认Load()机制,如Aghilas指出的那样, WebRequest对象。
WebRequest对象与您指定的URL联系,然后使用请求/响应模型创建Response对象。从该Response对象,您可以通过GetResponseStream()方法获取响应数据的流;这就是Aghilas所展示的。然后,您可以将该流放在其示例中的变量dataStream中,并将其传递给期望Stream的XmlDocument.Load()方法的重载:
//assuming prior code from Aghilas is here as appropriate...
Stream dataStream = response.GetResponseStream();
XmlDocument locRequest = new XmlDocument();
locRequest.Load(dataStream);
希望这有帮助。