Ответ WCF как Json в ASP.NET WebForms с использованием Json.NET - PullRequest
0 голосов
/ 27 января 2012

Я использую Службу WCF, в которой я хотел бы ответить списком объектов.Поскольку мои объекты генерируются структурой сущностей, я не могу вернуть список, так как он имеет некоторые циклические ссылки и сериализация по умолчанию завершается неудачно.Таким образом, я использую анонимные типы для создания списка объектов, содержащих только те свойства, которые мне нужны.Это то, что я делаю, используя Json.NET:

[OperationContract]
        public string DoWork()
        {
            using (X ent = new X())
            {
                var modules = from p in ent.Modules select new { Name = p.Name, Value = p.ID };
                return JsonConvert.SerializeObject(modules);
            } 
        }

Теперь это мой javascript, который отображает результат в таблице:

function btn_onclick() {
            var srv = new DDSProjectManagement.ProjectsService();
            srv.DoWork(Res, null, null);
        }
        function Res(dataList) {
            var divObj = document.getElementById('tablePos');

            var name = 'Name';
            var desc = 'Description';

            var tableStart = '<table><tbody><tr><th>Name</th><th>Description</th></tr>';
            var tableContent = '';
            var tableEnd = '</tbody></table>';

            for (var i = 0; i < dataList.length; i++) {
                tableContent += '<tr><td>' + dataList[i].Name + '</td><td>' + dataList[i].Value + '</td></tr>';
            }
            divObj.innerHTML = tableStart + tableContent + tableEnd;
        }

Если я это сделаю,Параметр, который получает javascript - это просто строка, и он не может видеть его как список моих объектов.Конечно, это должна быть строка Json, и я мог бы попытаться разобрать ее так, чтобы она извлекала из нее объекты.Но я действительно хочу использовать javascript, как он есть сейчас, и изменить сервис.Например, изменение моего сервиса в следующем случае будет работать нормально:

public List<SimpleObject> DoWork()
        {                
            return new List<SimpleObject>() { new SimpleObject("Florin", 1), new SimpleObject("Andrei", 2) };
        }

SimpleObject не является объектом EntityFramework, поэтому с этим нет проблем.Я полагаю, что сериализатором по умолчанию является Json, и javascript должен получать в основном тот же параметр: строку Json.

Поэтому мой вопрос заключается в том, как заставить мой метод отправлять список объектов анонимного типа в мой JS в процессе сборкистрока через Json.NET не работает?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2012

Это, наконец, сработало для меня. Тип возвращаемого значения метода Stream, и вот как он работает:

    public Stream GetModules()
            {
                using (PMEntity ent = new PMEntity())
                {                
                    List<Module> ret = new List<Module>();
                    ret = ent.Modules.Include("Project").ToList();

                    return new MemoryStream(
                            Encoding.UTF8.GetBytes(
                            JsonConvert.SerializeObject(
                            ret.Select(e => new { Name = e.Name, Value = e.ID }))));
                }
            }
0 голосов
/ 27 января 2012

Посмотрите на SignalR ... Это позволит вам передавать информацию в ваш JavaScript со стороны сервера.Я делаю нечто похожее, когда у меня есть служба WCF на моей странице ASP.NET MVC3, а затем, когда моя служба получает данные, я просто отправляю ее в свой JavaScript.

Мой сервис отправляет информацию моему посреднику SignalR:1005 *

public void Message(string messagePacket)
    {
        new NotificationMediator().NotifyClients(messagePacket);
    }

В моем случае я просто создаю новый медиатор (SignalR Hub) и затем вызываю для него метод.Вот мой обработчик SignalR для этого (NotifyClients):

public void NotifyClients(string message)
    {
        Hub.GetClients<NotificationMediator>().Log(message);

    }

Теперь, когда Log - это метод JavaScript в моем пользовательском интерфейсе.Вот мой код JavaScript, чтобы справиться с этим:

mediator.Log = function (message) {
        var msg = $.parseJSON(message);
        $("#logContainer").append(msg.Data + "<br />");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...