Не может сериализировать параметр типа 'Система. Linq. Счетный …' при использовании WCF, LINQ, JSON

У меня есть Сервис WCF. Это использует Linq к объектам для выбора из Словаря. Тип объекта прост:

public class User 
{
   public Guid Id;
   public String Name;
}

Существует набор сохраненных в a Dictionary<Guid,User>.

Я хочу иметь WCF OperationContract метод как это:

public IEnumerable<Guid> GetAllUsers()
{
    var selection = from user in list.Values
        select user.Id;
     return selection;
}

Это компилирует прекрасный, но когда я выполняю его, я добираюсь:

Сервер встретился с ошибкой при обработке запроса. Сообщение об исключении, 'Не может сериализировать параметр типа 'Система. Linq. Enumerable+WhereSelectEnumerableIterator2[Cheeso.Samples.Webservices._2010.Jan.User,System.Guid]' (for operation 'GetAllUsers', contract 'IJsonService') because it is not the exact type 'System.Collections.Generic.IEnumerable1 [Система. Гуид]' в сигнатуре метода и не находится в известном наборе типов. Для сериализации параметра добавьте тип к известному набору типов для операционного использования ServiceKnownTypeAttribute. '. Дополнительную информацию см. в журналах сервера.

Как я могу принудить выбор, чтобы быть IEnumerable<Guid> ?


Править
Если я изменяю код, чтобы сделать это, он работает хорошо - хорошая совместимость.

public List<Guid> GetAllUsers()
{
    var selection = from user in list.Values
        select user.Id;
     return new List<Guid>(selection);
}

Есть ли способ для меня избежать создания/инстанцирования List<T> ?

7
задан Cheeso 16 January 2010 в 16:47
поделиться

3 ответа

Нет, необходимо вернуть конкретный класс из веб-сервиса. Сделайте список типов возврата и выполнить с ним.

11
ответ дан 6 December 2019 в 11:49
поделиться

Вам нужно передавать совместимые коллекции в соответствии с вашими методами WCF.

WCF лучше всего играет с простыми типами и массивами.

Пройдите в массиве с вашего клиента, а затем превратить его в IENumerable в службе.

Такие вещи, такие как IENumerable, не взаимозаменяются, что является тем, что WCF пытается быть.

Там может быть способ обойти его с известными типами, но я всегда стремимся сделать мои компоненты как можно более гибкими.

1
ответ дан 6 December 2019 в 11:49
поделиться

У вас есть использовать атрибут ServiceKnownTypes.

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Web;

namespace Test.Service
{
    [ServiceContract(Name = "Service", Namespace = "")]
    public interface IService
    {
        [OperationContract]
        [WebInvoke(
            Method = "GET",
            BodyStyle = WebMessageBodyStyle.WrappedRequest,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json)]
        [ServiceKnownType(typeof(List<EventData>))]
        IEnumerable<EventData> Method(Guid userId);
    }
}

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

5
ответ дан 6 December 2019 в 11:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: