【问题标题】:HttpPost to REST WCF Service - Geting empty table when try to send DataTableHttpPost 到 REST WCF 服务 - 尝试发送 DataTable 时获取空表
【发布时间】:2012-11-14 07:14:52
【问题描述】:

我需要在 REST WCF 服务中测试一个 .Net 方法,该方法需要传入一个 DataTable 并返回一个 DataTable:

DataTable TryPostDataTable(DataTable dataTable);

在我的 Java 测试代码中,我使用 HtttClient 向该服务发送 Post 请求。它有标题:

"Content-Type", "text/xml; charset=utf-8"

和身体:

  <TryPostDataTable xmlns="http://tempuri.org/">
    <dataTable>
      <Person>
        <name>A Name</name>
        <age>An Age</age>
      </Person>
    </dataTable>
  </TryPostDataTable>

但是当服务收到请求时,dataTable变量总是变成一个空的DataTable实例,没有行和列

如果我将数据表的类型更改为字符串,并将帖子正文更改为:

  <TryPostDataTable xmlns="http://tempuri.org/">
    <datatable>
      TestString
    </datatable>
  </TryPostDataTable>

然后它会正确解析请求。

我不知道如何通过 HttpPost 传递 DataTable 对象。 Rest服务中从XML到DataTable的解析过程有什么问题?还是我的帖子不正确?

任何帮助将不胜感激。

//编辑1:

我尝试使用此代码生成 xml 内容:

DataTable dtEmployee = new DataTable("Person");                             
        dtEmployee.Columns.Add("Name", typeof(string));        
        dtEmployee.Columns.Add("Age", typeof(string));             
        dtEmployee.Rows.Add("A Name", "An Age");                        
        dtEmployee.WriteXml(@"C:\Working\Employee.xml", XmlWriteMode.WriteSchema);                       

将生成:

  <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Person" msdata:UseCurrentLocale="true">
  <xs:complexType>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="Person">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Name" type="xs:string" minOccurs="0" />
            <xs:element name="Age" type="xs:string" minOccurs="0" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:complexType>
</xs:element>

<Person>
    <Name>A Name</Name>
    <Age>An Age</Age>
  </Person>

然后我使用 httpPost 将此 xml 发送到 TryPostDataTable 方法。

服务现在成功解析架构并生成一个“Person”表,其中包含 2 列“Name”-“Age”,分配给变量 dataTable。但是没有行 - 里面没有数据。

【问题讨论】:

  • 你能显示你的person类吗?我的猜测是它不可序列化?
  • @Chris 我没有 Person 类。服务是否应该将我的 xml 解析为 DataTable ,名称为“Person”,2 列“name”-“age”,一行“A Name”-“An Age”?
  • 否 - 您正在尝试发布具有 Person 类型属性的数据表,该属性具有字符串属性名称和年龄。
  • @Chris 我不确定。 xml 由以下代码生成: DataTable dt = new DataTable("Person"); dt.Columns.Add("名称", typeof(string)); dt.Columns.Add("年龄", typeof(string)); dt.Rows.Add("一个名字", "一个时代"); dt.WriteXml(@"C:\Working\Employee.xml");所以我只是将结果传回给 HttpPost 主体,但它生成了一个空的 DataTable 实例。我不想要一个类型化的 DataTable,您能否提供一个示例 xml 或 google 关键字?

标签: java wcf rest httpclient


【解决方案1】:

我在服务器上有如下的 REST 方法:

[OperationContract]
[WebInvoke]
public DataTable GetMyDataTable(DataTable dt)
        {
            DataTable returnTable  = new DataTable("ServerTable");
            returnTable.Columns.Add(new DataColumn() { ColumnName = "FirstName", DataType = typeof(String)});
            returnTable.Columns.Add(new DataColumn() { ColumnName = "LastName", DataType = typeof(String) });

            if (dt.Columns.Count == 2 && dt.Rows.Count > 0)
            {
                return returnTable;
            }
            else
            {
                returnTable.Columns.Add(new DataColumn() { ColumnName = "MiddleName", DataType = typeof(String) });
                return returnTable;
            }
        }

调用 Web 服务时的原始请求应如下所示:

POST http://localhost/SampleService/Service1.svc/GetMyDataTable HTTP/1.1
Content-Type: application/xml
Content-Length: 1022
Host: rajeshwin7

<DataTable xmlns="http://schemas.datacontract.org/2004/07/System.Data"><xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"><xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="SampleTable" msdata:UseCurrentLocale="true"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element name="SampleTable"><xs:complexType><xs:sequence><xs:element name="FirstName" type="xs:string" minOccurs="0"/><xs:element name="LastName" type="xs:string" minOccurs="0"/></xs:sequence></xs:complexType></xs:element></xs:choice></xs:complexType></xs:element></xs:schema><diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"><DocumentElement xmlns=""><SampleTable diffgr:id="SampleTable1" msdata:rowOrder="0" diffgr:hasChanges="inserted"><FirstName>MyFirst</FirstName><LastName>MyLast</LastName></SampleTable></DocumentElement></diffgr:diffgram></DataTable>

我从服务器返回的响应如下:

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 804
Content-Type: application/xml; charset=utf-8
Date: Wed, 14 Nov 2012 17:07:37 GMT

<DataTable xmlns="http://schemas.datacontract.org/2004/07/System.Data"><xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"><xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="ServerTable" msdata:UseCurrentLocale="true"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element name="ServerTable"><xs:complexType><xs:sequence><xs:element name="FirstName" type="xs:string" minOccurs="0"/><xs:element name="LastName" type="xs:string" minOccurs="0"/></xs:sequence></xs:complexType></xs:element></xs:choice></xs:complexType></xs:element></xs:schema><diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"/></DataTable>

我确实发布了 Fiddler 捕获的原始请求和响应。只需监视您的请求的外观,这应该可以帮助您毫无问题地访问 REST 服务。此外,数据表应该有一个名称,否则它将无法序列化和反序列化。

【讨论】:

  • 非常感谢您的回答。通过添加标签 现在它可以解析数据\:D/
【解决方案2】:

最好把整个表格转成List 像这样,我用过:-

public List<user> fulldata()
        {

            string ConnectString = "server=localhost;database=test_local;integrated security=SSPI";
            string QueryString = "select * from tbl_register";

            SqlConnection myConnection = new SqlConnection(ConnectString);
            SqlDataAdapter da = new SqlDataAdapter(QueryString, myConnection);
            DataSet ds = new DataSet();
            da.Fill(ds, "Register Table");


            List<user> ls = new List<user>();
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                user res = new user();
                res.name = row["name"].ToString();
                res.company = row["cname"].ToString();
                res.address = row["address"].ToString();
                ls.Add(res);
            }
            return ls;
        }

        public class user
        {
            public string name { get; set; }
            public string company { get; set; }
            public string address { get; set; }
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-05
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    相关资源
    最近更新 更多