2016-01-18 3 views
1

Я использую C# & ASP.net для выполнения POST на веб-странице. Как я могу прочитать ответ XML, чтобы узнать, были ли у моего сообщения ошибки или был ли успех?Чтение XML-ответа со страницы

Это то, что я пробовал, но он вернет сообщение об успехе/неудаче, он не покажет мне фактический xml, возвращенный со страницы.

private void Perform() 
{ 
    this.lblResult.Text = string.Empty; 
    Dictionary<string, string> dictFormValues = new Dictionary<string, string>(); 
    string connectionString = null; 
    SqlConnection cnn; 
    SqlCommand cmd; 
    StringBuilder sql = new StringBuilder(); 
    SqlDataReader reader; 
    string email = string.Empty; 
    connectionString = "Data Source=server;Initial Catalog=db;User ID=;Password="; 
    sql.Append("select TOP 1 maexst "); 
    sql.Append("from redbone.redlight.dbo.maxima "); 

    cnn = new SqlConnection(connectionString); 
    try 
    { 
     cnn.Open(); 
     cmd = new SqlCommand(sql.ToString(), cnn); 
     reader = cmd.ExecuteReader(); 
     while (reader.Read()) { dictFormValues.Add("maexst", reader.GetValue(0).ToString()); } 
     reader.Close(); 
     cmd.Dispose(); 
     cnn.Close(); 
    } 
    catch (Exception ex) { Response.Write(ex.Message.ToString()); } 
    string strIpAddress = System.Web.HttpContext.Current.Request.UserHostAddress; 
    string strPageTitle = this.Title; 
    string strPageURL = System.Web.HttpContext.Current.Request.Url.AbsoluteUri; 
    string strError = ""; 
    bool blnRet = false; 
    blnRet = Post(dictFormValues, strPageTitle, strPageURL, ref strError); 
    if (blnRet == true) 
    { 
     this.lblResult.Text = "It was good!"; 
    } 
    else { this.lblResult.Text = strError + ": Error Occured"; } 
} 

public bool blnRet(Dictionary<string, string> dictFormValues, string strPageTitle, string strPageURL, ref string strMessage) 
{ 
    string strEndpointURL = string.Format("http://testtest12test123.aspx"); 

    System.Web.Script.Serialization.JavaScriptSerializer json = new System.Web.Script.Serialization.JavaScriptSerializer(); 
    string strPostData = ""; 
    foreach (var d in dictFormValues) { strPostData += d.Key + "=" + Server.UrlEncode(d.Value) + "&"; } 
    strPostData += "hs_context="; 
    System.Net.HttpWebRequest r = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(strEndpointURL); 
    r.Method = "POST"; 
    r.Accept = "application/json"; 
    r.ContentType = "application/x-www-form-urlencoded"; 
    r.ContentLength = strPostData.Length; 
    r.KeepAlive = false; 
    using (System.IO.StreamWriter sw = new System.IO.StreamWriter(r.GetRequestStream())) 
    { 
     try { sw.Write(strPostData); } 
     catch (Exception ex) 
     { 
      strMessage = ex.Message; 
      return false; 
     } 
    } 
    return true; 
} 

РЕДАКТИРОВАТЬ

УСПЕХ РЕАКЦИЯ

<?xml version="1.0" encoding="utf-8" ?> 
<result> 
    <success>1</success> 
    <postid>12345</postid> 
    <errors/> 
</result> 

FAIL-ОТВЕТ

<?xml version="1.0" encoding="utf-8" ?> 
<result> 
    <success>0</success> 
    <postid/> 
    <errors> 
     <error>Error Listed Here</error> 
     <error>Error 2 Listed Here</error> 
     <error>Error 3 Listed Here</error> 
    </errors> 
</result> 
+0

Чтобы прочитать ответ в Интернете, вы можете вызвать «r.GetResponseStream()» и прочитать его с помощью средства чтения потока или напрямую с помощью xmldocument – bdn02

+0

@ bdn02 - можете ли вы привести пример такого? – user2676140

ответ

3

Try:

var request = WebRequest.Create("http://some.website/") as HttpWebRequest; 
var response = request.GetResponse(); 

Stream receiveStream = response.GetResponseStream(); 
StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8); 

var result = readStream.ReadToEnd(); 

Это поместит содержимое страницы в result

Что делать дальше, зависит от того, что ответ на самом деле ... Оттуда вы можете использовать:

  • XmlDocument.LoadXml
  • XDocument.Parse
  • XElement.Parse

Возможно, что-то вроде HTML Agility Pack позволит вам разобрать ответ.


Пример использования XElement

using System.Xml.Linq; 
using System.Linq; 
using System.Xml; 

var xml = System.Xml.Linq.XElement.Parse(result); 
if (xml.Elements("success").FirstOrDefault().Value == "1") 
{ 
    // Process Success 
    Console.WriteLine("All Worked!"); 
} 
else 
{ 
    var errors = xml.Elements("errors"); 
    foreach (var error in errors.Elements("error")) 
    { 
    // read error messages 
    Console.WriteLine(error.Value); 
    } 
} 

(Runnable Fiddle)

Там, наверное, более простой способ разбора XElement, но это должно дать вам идею.

+0

, который ставит меня на 1 шаг ближе, спасибо! Я просто редактировал сообщение, чтобы показать, как отправляется ответ, как я могу разобрать ответ из переменной 'result' –

+0

Я получаю сообщение об ошибке: 'System.Collections.Generic.IEnumerable 'не содержит определения для «Элементов» и не используется метод расширения «Элементы», принимающий первый аргумент типа «System.Collections.Generic.IEnumerable » (вам не хватает использования директива или ссылка на сборку?) –

+2

У вас есть 'using System.Xml.Linq;' и 'using System.Linq;'? – NikolaiDante

Смежные вопросы