2014-03-05 55 views
3

長話短說,我正在嚮應用程序服務器發送XML HTTP請求,並且以XML HTTP的形式取回響應。獲取400或500 HTTP XML響應的XML正文

我有一個測試站點可供我使用,它使我能夠以XML的形式直觀地看到服務器的實際響應是什麼,但我無法按照它的方式從我的C#代碼中訪問此XML。

在我的測試情況下,應用程序服務器回來的XML看起來是這樣的:

<Error><Message>StringErrorMessage</Message></Error> 

不過,我有沒有運氣訪問這個基本的XML檢索「StringErrorMessage」的價值創造詳細的錯誤報告。

... More code above, all wrapped in a try{}... 

_response = Serializer.DeserializeObject<T>(ObjectRequest.GetResponse().GetResponseStream()); 

     } 
     catch (System.Net.WebException exceptionParameter) 
     { 
      var response = (HttpWebResponse)exceptionParameter.Response; 
      string webExceptionStatus = exceptionParameter.Message; 
      _exception = exceptionParameter; 
      return false; 
     } 

我已經諮詢 C# - Getting the response body from a 403 error

Get response body on 400 HTTP response in Android?

第一個環節的解決方案似乎並沒有給我訪問基本的XML作爲任何響應對象的屬性的一部分。我幾乎肯定在那裏必須有一個byte [](在響應或異常對象中)可以轉換爲char [],它可以轉換爲一個字符串,它可以轉換爲我的XML正文,但我一直無法找到它。第二個鏈接的解決方案對我來說不是完全可行的,因爲我必須以XML的形式返回響應體,因爲它可能不是錯誤,而是必須反序列化的對象。事情的這個特定的一面,我無法改變。

任何意見將非常感激。 - Eli

編輯:只是想澄清一下,我的基本代碼工作正常,非錯誤的情況下,並反序列化XML就好了。當我的代碼遇到HTTP 400或HTTP 500錯誤時,從catch語句訪問XML成爲問題,因爲我的代碼立即拋出異常。

回答

2

可以使用HttpWebResponse對象的GetResponseStream方法檢索HTTP消息的正文(您的案例中的XML)。而且,因爲它是一個流,例如你可以用StreamReader讀它,像這樣:

HttpWebResponse myWebResponse; // Get this from whereever you want 

Stream responseStream = myWebResponse.GetResponseStream(); 

StreamReader reader = new StreamReader(responseStream); 
string niceStringForYou = reader.ReadToEnd(); 

...並從這一點上,你可以做任何它。

如果你絕對相信它會一直XML你從服務後面,你可能甚至使用XmlReader直接從流獲取XML:

XmlReader foo = XmlReader.Create(responseStream); 

評論編輯:只要你有HttpWebResponse對象,就可以讀取它的響應流(GetResponseStream())。正如你在你自己的代碼中指出的,你可以通過查看(HttpWebResponse)exceptionParameter.Response來獲得HttpWebResponse。

+1

工作就像一個魅力!謝謝,阿夫 - 像你這樣的人讓S.O.這樣一個偉大的網站。 –

+0

只是爲了完成這個工作:可悲的是,我還沒有能夠讓XmlReader工作,但所描述的第一種方法工作得很好。不知道在這一點回應什麼回來,因爲當我有以下內容: XmlReader foo = XmlReader.Create(responseStream); string contents = foo.GetAttribute(「Message」); 內容保留null = *(也許有一天我會解開這個謎團... –