XML Document System.Net.WebException

时间:2012-09-20 18:25:06

标签: c# exception

我的代码中的这部分引发了异常。我该如何解决这个问题?

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

这有什么问题?

3 个答案:

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

希望这有帮助。