0

我的这部分代码抛出异常。我该如何解决?

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:对象引用未设置为对象的实例

那有什么问题?

4

3 回答 3

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 ();
..... 
于 2012-09-20T18:27:35.973 回答
0

以阿吉拉斯的帖子为基础...

返回的流是不可搜索的流,因此您需要使用类似于以下的函数读取到它的末尾:

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

希望这可以帮助。

于 2012-09-20T19:35:01.777 回答
0

英戈,

在您针对此问题的原始帖子的基础上,也许这会为您更清楚地组合在一起。假设手头有一些更基本的连接失败,而不仅仅是服务器出于某种原因不接受连接,您可以绕过 XmlDocument 类的默认 Load() 机制,正如 Aghilas 指出的那样, WebRequest 对象。

WebRequest 对象联系您指定的 URL,然后使用 Request/Response 模型创建一个 Response 对象。从该 Response 对象,您可以通过 GetResponseStream() 方法获取响应数据的流;这就是阿吉拉斯所展示的。然后,您可以将该流放在他的示例中的变量 dataStream 中,并将其传递给需要 Stream 的 XmlDocument.Load() 方法的重载:

   //assuming prior code from Aghilas is here as appropriate...
   Stream dataStream = response.GetResponseStream();
   XmlDocument locRequest = new XmlDocument();
   locRequest.Load(dataStream);

希望这可以帮助。

于 2012-09-21T15:05:00.047 回答