Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#.netweb服务Web方法返回&;书信电报;及;燃气轮机;视图中的源_C#_.net_Xml_Service - Fatal编程技术网

C#.netweb服务Web方法返回&;书信电报;及;燃气轮机;视图中的源

C#.netweb服务Web方法返回&;书信电报;及;燃气轮机;视图中的源,c#,.net,xml,service,C#,.net,Xml,Service,我有一个存储过程返回一个datatable,其中包含一个Web服务Web方法中的存储过程。然而,当我查看返回的XML的源代码(在浏览器窗口中看起来很好)时,我尝试将datatable转换为XML,而不是在XML节点周围返回和 我已经研究过类似的问题,并且我尝试过使用HTMLEncode或HTMLEDCODE但没有任何效果 这是我的Web服务代码 using System; using System.Collections.Generic; using System.Data; using Sys

我有一个存储过程返回一个datatable,其中包含一个Web服务Web方法中的存储过程。然而,当我查看返回的XML的源代码(在浏览器窗口中看起来很好)时,我尝试将datatable转换为XML,而不是在XML节点周围返回

我已经研究过类似的问题,并且我尝试过使用HTMLEncodeHTMLEDCODE但没有任何效果

这是我的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();
    }
}
使用系统;
使用System.Collections.Generic;
使用系统数据;
使用System.Data.SqlClient;
使用系统文本;
使用System.Web;
使用System.Web.Services;
使用System.Xml;
名称空间DAL
{
[WebService(命名空间=”http://tempuri.org/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
公共类iPhoneWebServices:System.Web.Services.WebService
{
[WebMethod(Description=“返回所有当前品牌”)]
公共字符串ReturnMakes()
{
//获取具有NAME参数的所有记录
DataTable DataTable=DataAccessLayer.ExecuteDataTable(“ipa_ReturnMakes”);
StringBuilder sbrXML=新的StringBuilder();
如果(dataTable.Rows.Count>0)
{
sbrXML.AppendLine(“”);
foreach(dataTable.Rows中的DataRow objRow)
{
sbrXML.AppendLine(“[makeID][makeName]”);
sbrXML.Replace(“[makeID]”,objRow[“makeID”].ToString());
sbrXML.Replace(“[makeName]”,objRow[“makeName”].ToString());
}
sbrXML.AppendLine(“”);
}
其他的
{
//没有数据
sbrXML.AppendLine(“”);
AppendLine(“无数据”);
sbrXML.AppendLine(“”);
}
返回sbrXML.ToString();
}
//从Make ID返回模型
[WebMethod(Description=“从Make ID返回模型”)]
公共字符串返回模型(int-MakeID)
{
SqlParameter[]param=新的SqlParameter[1];
param[0]=新的SqlParameter(“MakeID”,SqlDbType.Int);
参数[0]。值=MakeID;
//获取具有NAME参数的所有记录
DataTable DataTable=DataAccessLayer.ExecuteDataTable(“ipa_ReturnModelsForMake”,参数);
StringBuilder sbrXML=新的StringBuilder();
如果(dataTable.Rows.Count>0)
{
sbrXML.AppendLine(“”);
foreach(dataTable.Rows中的DataRow objRow)
{
sbrXML.AppendLine(“[modelID][modelName]”);
sbrXML.Replace(“[modelID]”,objRow[“modelID”].ToString());
sbrXML.Replace(“[modelName]”,objRow[“modelName”].ToString());
}
sbrXML.AppendLine(“”);
}
其他的
{
//没有数据
sbrXML.AppendLine(“”);
AppendLine(“无数据”);
sbrXML.AppendLine(“”);
}
返回sbrXML.ToString();
}
}
}

它在Web方法“ReturnModels”的视图源中返回的内容


模型列表
ModelID20945/ModelIDModelNameAnglia/ModelName/Model
ModelID11006/ModelIDModelNameTransit/ModelName/Model
ModelID21952/ModelIDModelNameZodiac Mark III/ModelName/Model
/模型列表
它在浏览器窗口中正确显示:

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

20945安格利亚
最大15881C
20303卡普里
11006传输
21952十二生肖三
只需要将浏览器窗口中显示的内容也输入到视图源中


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

ASP.NET Web服务使用SOAP协议。这意味着您从WebMethods返回的任何信息都将自动放入SOAP信封中,并进行XML编码。您不能修改响应的格式,因为您将违反SOAP协议。您不必担心浏览器中显示的内容。重要的是,这是一个格式正确的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();
}
[WebMethod(Description=“返回所有当前品牌”)]
公共物品
{
//获取具有NAME参数的所有记录
DataTable DataTable=DataAccessLayer.ExecuteDataTable(“ipa_ReturnMakes”);
列表生成=新列表();
如果(dataTable.Rows.Count>0)
{
foreach(dataTable.Rows中的DataRow objRow)
{
新品牌
{
MakeID=objRow[“MakeID”].ToString(),
MakeName=objRow[“MakeName”].ToString()
};
make.添加(make);
}
}
返回make.ToArray();
}

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

尽管如此,您所做的(从表示XML的WebMethods返回字符串)是一种非常糟糕的做法,因为会出现双重编码。我建议您定义一些自定义类型
[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();
}