2011-03-20 80 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