0

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インスタンスになり、行と列はありません

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メソッドに送信します。

これで、サービスはスキーマを正常に解析し、変数dataTableに割り当てられた2つの列「Name」-「Age」を持つ「Person」テーブルを生成します。しかし、行はありません-内部にデータはありません。

4

2 に答える 2

0

以下のように、サーバーに 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 サービスを呼び出すときの raw リクエストは次のようになります。

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 によってキャプチャされた生のリクエストとレスポンスを POST しました。リクエストがどのように見えるかを監視するだけで、問題なく REST サービスにアクセスできるようになります。また、データ テーブルには名前が必要です。そうしないと、シリアル化と逆シリアル化に失敗します。

于 2012-11-14T17:10:50.113 に答える