Skip to main content
 首页 » 编程设计

C# .net Web 服务 Web 方法在查看源代码中返回 和 >

2024年02月23日27EasonJim

我有一个存储过程在 Web 服务 Web 方法中返回一个带有存储过程的数据表。然后我试图将数据表转换为 XML,但是,当我查看返回的 XML 的源代码(在浏览器窗口中看起来不错)而不是 <> 时,它返回 < 和 > 围绕 XML 节点。

我查看了类似的问题,并且我已经尝试使用 HTMLEncode 或 HTMLDecode 但无济于事。

这是我的 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”的 View 源中返回了什么

    <?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> 

只需要将浏览器窗口中显示的内容也放入 View 源中即可。

感谢您的帮助和提前时间!

请您参考如下方法:

ASP.NET WebServcies 使用 SOAP 协议(protocol)。这意味着无论您从 WebMethods 返回什么信息,它都将自动放入 SOAP 信封中并进行 XML 编码。您不能修改响应的格式化方式,因为您将违反 SOAP 协议(protocol)。您不必担心浏览器中显示的内容。重要的是,这是一个格式正确的 XML,客户端将接收(作为字符串结果)并可以将其转换为 XML。

这就是说你在做什么(从表示 XML 的 WebMethods 返回字符串)是一个非常糟糕的做法,因为会有双重编码。我建议您定义一些自定义类型来表示此 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(); 
}