【问题标题】:XML Document System.Net.WebExceptionXML 文档 System.Net.WebException
【发布时间】:2012-09-21 23:40:09
【问题描述】:

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

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

这有什么问题?

【问题讨论】:

  • 您确定 player.IP 包含有效的 IP 地址吗?

标签: c# exception


【解决方案1】:

您可以使用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 ();
..... 

【讨论】:

  • @Ingo,您可以将Aghilas的响应中创建的dataStream对象作为参数传递给XmlDocument类中重载的Load方法,例如XmlDocument locRequest = new XmlDocument(); locRequest.Load(dataStream);
【解决方案2】:

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

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    英戈,

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

    WebRequest 对象联系您指定的 URL,然后使用 Request/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);
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 2020-07-10
      • 2013-07-20
      • 2012-10-31
      相关资源
      最近更新 更多