2012-11-14 21 views
0

我需要測試在REST WCF服務的.NET方法,即需要傳遞一個DataTable,並也可以返回一個DataTable:HttpPost以REST WCF服務 - 葛亭空表時嘗試發送數據表

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的類型更改爲String,並將Post主體更改爲:

<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。但沒有排 - 內部沒有數據。

+0

你能證明你的人的類?我的猜測是它的不可序列化? – Chris

+0

@Chris我沒有Person類。服務應該將我的XML解析爲DataTable,名稱爲「Person」,2列「name」 - 「age」,以及一行「A Name」 - 「An Age」? – Pham

+0

否 - 您試圖發佈帶有Person類型屬性的數據表,其中包含字符串屬性名稱和年齡。 – Chris

回答

0

我有服務器下面我REST方法:

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> 

我從我的服務器回來的響應:

[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服務時,應該看看下面原始的請求如下所示:

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> 

我做過POST原始請求和響應由Fiddler捕獲。只需監視您的請求的外觀,這應該有助於您毫無問題地訪問REST服務。此外,數據表應該有一個名稱,否則它將無法序列化和反序列化。

+0

非常感謝您的回答。通過添加標籤現在它可以解析數據\:D / – Pham

0

這是更好地爲整個表格轉換成列表 這樣的,我用: -

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