none
WCF REST серилизация DataTable RRS feed

  • Вопрос

  • Есть класс, методы которого возвращают данные в виде DataTable. Хочу сделать сервисы WCF REST которые реализуют некоторые методы. Столкнулся с проблеммой серилизации ответа. Хочу что бы DataTable сериализовывался в понятный XML (и затем в JSON)

    Пример.

    <?xml version="1.0" encoding="utf-16"?>
    <ArrayOfOrderDetailsItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <OrderDetailsItem>
            <OrderDetailSubId>28170892</OrderDetailSubId>
            <OrderedQuantity>1</OrderedQuantity>
            <DateAdd>2011-11-22T11:48:29.17</DateAdd>
        </OrderDetailsItem>
        <OrderDetailsItem>
            <OrderDetailSubId>28170893</OrderDetailSubId>
            <OrderedQuantity>30</OrderedQuantity>
            <DateAdd>2011-11-22T11:48:29.15</DateAdd>
        </OrderDetailsItem>
        <OrderDetailsItem>
            <OrderDetailSubId>28170894</OrderDetailSubId>
            <OrderedQuantity>22</OrderedQuantity>
            <DateAdd>2011-11-22T11:48:29.13</DateAdd>
        </OrderDetailsItem>
    </ArrayOfOrderDetailsItem>

    Как это реализовать в WCF? Без преобразования DataTable в другой тип, структуру.

    22 ноября 2011 г. 11:55

Ответы

  • > Хочу сделать сервисы WCF REST [...] что бы DataTable сериализовывался в понятный XML (и затем в JSON)

     

    чтобы вернуть JSON надо указать WebMessageFormat.Json и вернуть все DataRow.ItemArray.
    (для компиляции: в свойствах проекта указать Target Framework = .NET Framework 4;
    и подключить сборки System.ServiceModel.Web.dll и System.ServiceModel.dll)
     
      

    using System;
    using System.Data;
    using System.Net;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.Windows.Forms;
    using System.Linq;
    using System.Collections.Generic;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                var url = new Uri("http://localhost:8845");
                var host = new WebServiceHost(typeof(Service), url);
                host.Open();
                this.FormClosing += (s, e) => host.Close();
    
                this.Size = new System.Drawing.Size(800, 400);
                var wb = new WebBrowser { Parent = this, Dock = DockStyle.Fill };
    
                this.Menu = new MainMenu();
                this.Menu.MenuItems.Add("xml", (s, e) => wb.Navigate(url + "/x"));
                this.Menu.MenuItems.Add("json", delegate
                {
                    var c = new WebClient();
                    c.DownloadStringCompleted += (s, e) => wb.DocumentText = e.Result;
                    c.DownloadStringAsync(new Uri(url, "/j"));
                });
            }
        }
    
        [ServiceContract, ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
        public class Service
        {
            DataSet CreateData()
            {
                var dt = new DataTable();
                dt.Columns.Add("Id", typeof(int));
                dt.Columns.Add("Text", typeof(string));
                for (int i = 0; i < 5; i++) dt.Rows.Add(i, "txt"+i);
                var ds = new DataSet();
                ds.Tables.Add(dt);
                ds.AcceptChanges();
                return ds;
            }
            [OperationContract, WebGet(UriTemplate = "/x/", ResponseFormat = WebMessageFormat.Xml)]
            public DataSet Xml()
            {
                return CreateData();
            }
            [OperationContract, WebGet(UriTemplate = "/j/", ResponseFormat = WebMessageFormat.Json)]
            public IEnumerable<object[]> Json()
            {
                return CreateData().Tables[0].Rows.OfType<DataRow>().Select(r => r.ItemArray);
            }
        }
    }
    

     

    • Изменено Malobukv 22 ноября 2011 г. 17:27
    • Предложено в качестве ответа Malobukv 8 декабря 2011 г. 7:23
    • Помечено в качестве ответа Abolmasov DmitryModerator 14 декабря 2011 г. 23:35
    22 ноября 2011 г. 17:25