2012-09-20 110 views
0

我的代碼的這部分引發異常。我該如何解決這個問題?XML文檔System.Net.WebException

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: Error: ConnectFailure (Not enough buffer space is available)

完整的錯誤http://pastebin.com/8u6MpeWS

編輯: 如果我添加 locrequest.XmlResolver = null; 它拋出另一個異常:

System.NullReferenceException: Object reference not set to an instance of an object

這有什麼錯呢?

+0

你確定player.IP包含一個有效的IP地址嗎? –

回答

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(); 
..... 
+0

對不起,但我不明白。 – recon

+0

你把這段代碼放在try catch中,並給出異常 –

+0

@Ingo,你可以在Aghilas的響應中將這裏創建的dataStream對象作爲參數傳遞給XmlDocument類的重載Load方法,例如XmlDocument locRequest = new XmlDocument( ); locRequest.Load(數據流); –

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

希望這有助於。

0

英戈,

大廈您的原始信息對於這個問題here,也許這將會把拼在一起爲你多一點清楚。假設有一些關於連接失敗的更基本的事情,不僅僅是因爲某種原因服務器不接受連接,你可以像Aghilas指出的那樣,通過使用XmlDocument類的默認Load()機制來繞過WebRequest對象。

WebRequest對象聯繫您指定的URL,然後使用請求/響應模型創建Response對象。從該響應對象,您可以通過GetResponseStream()方法獲取到響應的數據;這就是阿吉拉斯所展示的。然後,您可以採取的流,放置在可變數據流他的樣本中,並傳遞到過載對於預期流將XMLDocument.load方法()方法:

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

希望這有助於。