Веб-метод веб-службы C # .net, возвращающий <и> в View Source - PullRequest
1 голос
/ 20 марта 2011

У меня есть хранимая процедура, возвращающая данные с помощью хранимой процедуры в веб-методе веб-службы. Я пытаюсь затем преобразовать данные в XML, однако, когда я просматриваю источник возвращенного XML (который выглядит хорошо в окне браузера), вместо <> он возвращает &lt; и &gt; вокруг узлов XML.

Я посмотрел на подобные вопросы, и я попытался , используя HTMLEncode или HTMLDecode , но безрезультатно.

Вот мой код веб-службы.

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();
    }
}

}

Что он возвращает в исходном представлении для веб-метода «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>

Просто нужно перенести то, что отображается в окне браузера, в источник просмотра.

Спасибо за вашу помощь и время заранее!

1 Ответ

4 голосов
/ 20 марта 2011

ASP.NET WebServcies используют протокол SOAP.Это означает, что любая информация, которую вы возвращаете из своих WebMethods, будет автоматически помещена в конверт SOAP и закодирована в XML.Вы не можете изменить форматирование вашего ответа, так как вы будете нарушать протокол SOAP.Вы не должны беспокоиться о том, что отображается в браузере.Важно то, что это правильно отформатированный XML, который будет получен клиентом (в виде результата строки) и может быть преобразован в XML.

Это говорит о том, что вы делаете (возвращая строку из ваших WebMethodsпредставление XML) - очень плохая практика, поскольку будет двойное кодирование.Я бы порекомендовал вам определить некоторый пользовательский тип, который будет представлять эту структуру XML и возвращать этот пользовательский тип.Это сделает ваш веб-сервис более простым для обнаружения и понимания, поскольку сейчас любой потребитель, рассматривающий 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...