Заполнение jqGrid с помощью JSON - производительность с использованием WCF и ASMX для серверной части - PullRequest
1 голос
/ 14 июня 2011

Я использую серверную часть ASMX для заполнения клиентской части jqGrid, в том числе клиентской подкачки сетки, чтобы все строки данных загружались одновременно.Мой вопрос заключается в том, является ли это лучшим подходом к производительности и надежности?Кроме того, если WCF будет лучше, чем ASMX, довольно легко преобразовать этот существующий набор в WCF (я предполагаю, что мне следует использовать методы WebGet в стиле REST, но я не уверен).Просто хочу, чтобы все было максимально быстро и быстро, практически без обратной передачи.

Вот код ASMX:

public class JQGrid
{
    public class Row
    {
        public int id { get; set; }
        public List<string> cell { get; set; }
        public Row()
        {
            cell = new List<string>();
        }
    }

    public int page { get; set; }
    public int total { get; set; }
    public int records { get; set; }
    public List<Row> rows { get; set; }
    public JQGrid()
    {
        rows = new List<Row>();
    }
}  

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.None)]
[ScriptService]
public class JQGridService : System.Web.Services.WebService
{
    [WebMethod(EnableSession = true)]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public JQGrid GetJQGrid(int pageIndex, int pageSize, string sortIndex, string sortDirection)
    {
        DataTable dt = GetDataTable( // command string ); 

        if (dt == null)
            throw new Exception("Unable to retrieve data.");

        JQGrid jqGrid = new JQGrid();

        foreach (DataRow sourceRow in dt.Rows)
        {
            JQGrid.Row targetRow = new JQGrid.Row();
            targetRow.id = Convert.ToInt32(sourceRow["ID"]);
            targetRow.cell.Add(sourceRow["ID"].ToString());
            targetRow.cell.Add(sourceRow["SomeColumn"].ToString());
            jqGrid.rows.Add(targetRow);
        }

        jqGrid.page = pageIndex; 
        jqGrid.records = jqGrid.rows.Count;
        jqGrid.total = jqGrid.rows.Count;  // Set this to total pages in your result...          

        return jqGrid;
    }
}

JS на стороне клиента:

function getData(pdata)
     {
         var params = new Object();

        params.pageIndex = pdata.page; 
        params.pageSize = pdata.rows;
        params.sortIndex = pdata.sidx;
        params.sortDirection = pdata.sord;

        $.ajax(
            {
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: "JQGridService.asmx/GetJQGrid",
                data: JSON.stringify(params),
                dataType: "json",
                success: function (data, textStatus) 
                {
                    if (textStatus == "success") {
                        var thegrid = $("#jqGrid")[0];

                        thegrid.addJSONData(data.d);
                    }
                },
                error: function (data, textStatus) {
                    alert('An error has occured retrieving data!');
                }
            });
        }

        function pageLoad() { loadGrid() }; 

        function loadGrid() {

            $("#jqGrid").jqGrid({

                gridComplete: function() {
                    $("#jqGrid").setGridParam({ datatype: 'local' });  
                },
                datatype: function (pdata) {
                    getData(pdata);
                },
                colNames: ['ID', SomeColumn],
                colModel: [
                    { name: 'ID', index: 'ID', width: 150 },
                    { name: SomeColumn, index: SomeColumn, width: 250}],
                rowNum: 10,
                rowList: [10, 20, 30],
                viewrecords: false,
                pagination: true,
                pager: "#jqPager",
                loadonce: true,
                sortorder: "desc",
                sortname: 'id',
                cellEdit: false
            });
        }

1 Ответ

1 голос
/ 14 июня 2011

Я нашел этот ответ от модератора Microsoft (Грегори Лейка) на их форумах о том, стоит ли использовать веб-сервисы ASMX или WCF.Ключевая цитата (для меня):

WCF - это стратегическая коммуникационная технология Microsoft для .NET.ASMX поддерживается;но это не будущее

Начиная с версии 3.5 с пакетом обновления 1 (SP1), я лично не использовал службы ASMX и с функциональностью WCF WebHttp Services , выпущенной в .NET 4Framework, я не оглядывался назад.

Переход на использование служб WCF REST из ASMX, вероятно, будет включать:

  1. Украшение вашего класса JQGrid с помощью DataContract и DataMemberАтрибуты;
  2. Очевидно, создается интерфейс службы WCF (IJQGridService) и реализуется класс (JQGridService).Ваша реализация JQGridService, вероятно, сильно изменится, за исключением атрибутов класса, заменив текущие атрибуты на WebGetAttribute (в интерфейсе) и AspNetCompatibilityRequirementsModeAttribute (в классе реализации).
  3. НекоторыеИзменения в файле web.config, поскольку теперь у вас будет раздел <system.serviceModel>;но если вы добавите службу WCF с поддержкой AJAX в свой проект, большинство из этих настроек уже будут в вашем распоряжении.Единственное, что вы, вероятно, захотите изменить, это то, что endpointBehavior будет использовать <webHttp/> вместо <enableWebScript>.
  4. . Вам не нужно вносить какие-либо изменения в JS на стороне клиента, кроме изменения URL-адреса.если имя вашей службы меняется (что, вероятно, изменится), и вам также следует перейти на использование глагола GET от POST, поскольку вы просто извлекаете данные.jqGrid отлично справляется с обработкой необходимых параметров для подкачки в строке запроса.

Кроме этого, вы, вероятно, готовы.

Надеюсь, это поможет.Если есть другие вопросы, дайте мне знать, и я обновлю этот ответ.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...