C# XML文档系统.Net.WebException

C# XML文档系统.Net.WebException,c#,exception,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.SelectSingleN

我的代码的这一部分引发了一个异常。我怎样才能解决这个问题

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(可用缓冲区空间不足)

完全错误

编辑: 如果我加上
locrequest.XmlResolver=null
它引发另一个异常:

System.NullReferenceException:对象引用未设置为对象的实例


有什么问题吗?

您可以使用
WebRequest
类来加载文件

链接:


建立在阿吉拉斯的岗位上

返回的流是不可查找的流,因此需要使用类似于以下的函数将其读取到末尾:

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));
希望这能有所帮助。

Ingo

在你原来关于这个问题的文章的基础上,也许这会让你更清楚地了解这些问题。假设除了服务器出于任何原因不接受连接之外,连接失败还有更基本的原因,您可以使用Aghilas指出的WebRequest对象绕过XmlDocument类的默认Load()机制

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

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

希望这有帮助。

您确定player.IP包含有效的IP地址吗?@Ingo,您可以在Aghilas的响应中获取此处创建的dataStream对象,并将其作为参数传递给XmlDocument类中的重载加载方法,例如XmlDocument locRequest=new XmlDocument();locRequest.Load(数据流);
   //assuming prior code from Aghilas is here as appropriate...
   Stream dataStream = response.GetResponseStream();
   XmlDocument locRequest = new XmlDocument();
   locRequest.Load(dataStream);