我有一个存储过程在 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/"><ModelList>
<Model><ModelID>20945</ModelID><ModelName>Anglia</ModelName></Model>
<Model><ModelID>11006</ModelID><ModelName>Transit</ModelName></Model>
<Model><ModelID>21952</ModelID><ModelName>Zodiac Mark III</ModelName></Model>
</ModelList>
</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();
}
