2011-03-20 29 views
1

我有一個存儲過程在Web服務Web方法中使用存儲過程返回數據表。然後,當我查看返回的XML的源代碼(在瀏覽器窗口中看起來不錯)時,它將返回&lt;&gt;圍繞XML節點。C#.net Web服務Web方法在查看源代碼中返回<和>

我已經看過了類似的問題,我使用的HTMLEncodeHTMLDecode無濟於事嘗試。

這是我的Web服務代碼。

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.SqlClient; 
using System.Text; 
using System.Web; 
using System.Web.Services; 
using System.Xml; 

namespace DAL 
{ 
    [WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [System.ComponentModel.ToolboxItem(false)] 
public class iPhoneWebServices : System.Web.Services.WebService 
{ 
    [WebMethod(Description="Return All Current Makes")] 
    public string ReturnMakes() 
    { 
     // Get All Records with NAME Parameter 
     DataTable dataTable = DataAccessLayer.ExecuteDataTable("ipa_ReturnMakes"); 

     StringBuilder sbrXML = new StringBuilder(); 

     if (dataTable.Rows.Count > 0) 
     { 
      sbrXML.AppendLine("<MakeList>"); 

      foreach (DataRow objRow in dataTable.Rows) 
      { 
       sbrXML.AppendLine("<Make><MakeID>[makeID]</MakeID><MakeName>[makeName]</MakeName></Make>"); 
       sbrXML.Replace("[makeID]", objRow["MakeID"].ToString()); 
       sbrXML.Replace("[makeName]", objRow["MakeName"].ToString()); 
      } 
      sbrXML.AppendLine("</MakeList>"); 
     } 
     else 
     { 
      // no data 
      sbrXML.AppendLine("<makeList>"); 
      sbrXML.AppendLine("no data"); 
      sbrXML.AppendLine("</makeList>"); 
     } 
     return sbrXML.ToString(); 
    } 

    //Return Models From Make ID 
    [WebMethod(Description="Returns Models From Make ID")] 
    public string ReturnModels(int MakeID) 
    { 

     SqlParameter[] param = new SqlParameter[1]; 
     param[0] = new SqlParameter("MakeID", SqlDbType.Int); 
     param[0].Value = MakeID; 

     // Get All Records with NAME Parameter 
     DataTable dataTable = DataAccessLayer.ExecuteDataTable("ipa_ReturnModelsForMake", param); 

     StringBuilder sbrXML = new StringBuilder(); 

     if (dataTable.Rows.Count > 0) 
     { 
      sbrXML.AppendLine("<ModelList>"); 

      foreach (DataRow objRow in dataTable.Rows) 
      { 
       sbrXML.AppendLine("<Model><ModelID>[modelID]</ModelID><ModelName>[modelName]</ModelName></Model>"); 
       sbrXML.Replace("[modelID]", objRow["ModelID"].ToString()); 
       sbrXML.Replace("[modelName]", objRow["ModelName"].ToString()); 
      } 
      sbrXML.AppendLine("</ModelList>"); 
     } 
     else 
     { 
      // no data 
      sbrXML.AppendLine("<ModelList>"); 
      sbrXML.AppendLine("no data"); 
      sbrXML.AppendLine("</ModelList>"); 
     } 
     return sbrXML.ToString(); 
    } 
} 

}

什麼它返回在Web方法查看源代碼 「ReturnModels」

<?xml version="1.0" encoding="utf-8"?> 
<string xmlns="http://tempuri.org/">&lt;ModelList&gt; 
&lt;Model&gt;&lt;ModelID&gt;20945&lt;/ModelID&gt;&lt;ModelName&gt;Anglia&lt;/ModelName&gt;&lt;/Model&gt; 
&lt;Model&gt;&lt;ModelID&gt;11006&lt;/ModelID&gt;&lt;ModelName&gt;Transit&lt;/ModelName&gt;&lt;/Model&gt; 
&lt;Model&gt;&lt;ModelID&gt;21952&lt;/ModelID&gt;&lt;ModelName&gt;Zodiac Mark III&lt;/ModelName&gt;&lt;/Model&gt; 
&lt;/ModelList&gt; 
</string> 

它正確顯示在瀏覽器窗口:

<string> 
<ModelList> 
<Model><ModelID>20945</ModelID><ModelName>Anglia</ModelName></Model> 
<Model><ModelID>15881</ModelID><ModelName>C-Max</ModelName></Model> 
<Model><ModelID>20303</ModelID><ModelName>Capri</ModelName></Model> 
<Model><ModelID>11006</ModelID><ModelName>Transit</ModelName></Model> 
<Model><ModelID>21952</ModelID><ModelName>Zodiac Mark III</ModelName></Model> 
</ModelList> 
</string> 

剛需以便將瀏覽器窗口中顯示的內容也顯示在視圖源中。

感謝您的幫助和提前的時間!

+0

如果你想輸出XML,那麼你真的應該創建XML,不只是自己寫的吧。 – Prisoner 2011-03-20 20:14:35

+0

@Prisoner你是完全正確的。替換不是製作XML文檔的方式。 Xelement,ToArray,ToList應該被使用或者天堂禁止String.Format。 – Jeremy 2011-03-20 20:54:45

回答

4

ASP.NET WebServcies使用SOAP協議。這意味着無論您從WebMethods返回的任何信息都會自動放入SOAP信封並進行XML編碼。您將無法修改響應格式化的方式,因爲您將違反SOAP協議。您不必擔心瀏覽器中顯示的內容。重要的是,這是一個格式正確的XML,它將被客戶端接收(作爲字符串結果)並可以轉換爲XML。

這就是你要做的事(從WebMethods返回的表示XML的字符串)是一個非常糟糕的做法,因爲會有雙重編碼。我建議你定義一些代表這個XML結構的自定義類型並返回這個自定義類型。它將使您的Web服務更易於發現和理解,因爲任何查看WSDL的消費者都會看到一個返回字符串值的方法,但不知道該字符串表示具有某種特殊格式的XML結構。

這裏就是我的意思是:

public class Make 
{ 
    public string MakeID { get; set; } 
    public string MakeName { get; set; } 
} 

然後:

[WebMethod(Description="Return All Current Makes")] 
public Make[] ReturnMakes() 
{ 
    // Get All Records with NAME Parameter 
    DataTable dataTable = DataAccessLayer.ExecuteDataTable("ipa_ReturnMakes"); 
    List<Make> makes = new List<Make>(); 

    if (dataTable.Rows.Count > 0) 
    { 
     foreach (DataRow objRow in dataTable.Rows) 
     { 
      Make make = new Make 
      { 
       MakeID = objRow["MakeID"].ToString(), 
       MakeName = objRow["MakeName"].ToString() 
      }; 
      makes.Add (make); 
     } 
    } 
    return makes.ToArray(); 
} 
+0

嗨達林我試過你的上述解決方案,我收到的所有回覆是'<?xml version =「1.0」encoding =「utf-8」?> ' 這是它應該返回的內容嗎?如果是的話,在SOAP中查看XML最簡單的方法是什麼? – TravelingAdMan 2011-03-21 13:05:49

+0

找出問題所在。你的代碼缺少make.Add(make),所以列表沒有被填充。一旦我補充說,它一切正常。謝謝你的幫助。 – TravelingAdMan 2011-03-21 13:36:25

+1

響應已添加缺少:makes.Add(make) – 2012-11-13 20:31:11