Не удается отправить общий список в качестве параметра в метод WCF

#c# #wcf #generics

#c# #wcf #общие

Вопрос:

У меня есть служба WCF, в которой один из методов (или операционный контракт) использует общий список определенного типа в качестве параметра, однако, когда я пытаюсь использовать эту службу и вызываю этот конкретный метод, я получаю эту ошибку

 Cannot convert type 'System.Collections.Generic.List<CA.CCS.sCmd>' to 'CA.CCS.sCmd[]'
  

Я не знаю, почему ожидается массив объектов вместо общего списка в коде потребителя.

Я хочу отправить этот параметр только как общий список, без каких-либо преобразований на клиенте или сервере, поскольку это снижает производительность службы.

Я нашел похожие вопросы по переполнению стека, но ни один из них не решает мою проблему.

ваш ответ или ссылка на ответ другого пользователя будут высоко оценены.

Обновление: я получаю это окно, когда пытаюсь добавить ссылку на службу, не могу найти здесь никаких настроек

введите описание изображения здесь

Комментарии:

1. проверьте настройки в вашем прокси-генераторе — может быть, вы решите использовать массив вместо списка / ObservableCollection?

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

3. вы можете установить их в диалоговом окне «Добавить ссылку на службу»

4. Обновлен вопрос… пожалуйста, проверьте

5. вы можете задаться вопросом об этом окне ссылки на службу, оно похоже на это, потому что я использую VS2005 (с установленным дополнением) для использования службы WCF

Ответ №1:

Поскольку вы все еще используете VS2005, и ваш прокси-генератор, по-видимому, хочет превратить это в параметр массива, вам просто нужно преобразовать свой List<T> в T[] всякий раз, когда вы вызываете этот метод.

Поскольку у вас есть List<T> экземпляр, вы можете просто использовать его ToArray метод (поддерживается начиная с .NET 2.0). Поэтому вместо вызова SomeMethod(myList) вы можете сделать SomeMethod(myList.ToArray()) .

Ответ №2:

Я хочу отправить этот параметр только как общий список, без каких-либо преобразований на клиенте или сервере, поскольку это снижает производительность службы.

Здесь я чего-то не понимаю: вы вызываете службу WCF, поэтому либо вы неправильно используете ее для отправки больших объемов данных, либо проблем с производительностью нет. Кроме того, я думаю, что вы слишком беспокоитесь о производительности здесь. Какую проблему с производительностью вы ожидаете? Даже если у вас очень большой список: если он содержит только ссылочные типы, массив представляет собой просто список меньших указателей. Только если у вас большое количество структур или других типов значений, возникнут проблемы с производительностью, но все же список из 10 000 двойных значений использует только около 80 КБ памяти.

И если вы введете этот код:

 List<int> myList = new List<int>();
for (int i = 0; i < 10000; i  )
  myList.Add(i);
  

вероятно, вы закодировали большую проблему с производительностью.

Если у вас нет дополнительной информации о том, что может создать проблему, я бы сказал, используйте ToArray() и готово.

Комментарии:

1. У меня не очень большой список данных, но этот тип данных будет передаваться много раз многими клиентами через Интернет на одном сервере, вот почему я беспокоился, но с помощью вашего объяснения теперь я согласен. Функция toArray(). 🙂 Спасибо

Ответ №3:

информация о конкретном типе коллекции теряется в метаданных при экспорте в wsdl, другими словами, коллекции, отправляемые между сервисом и потребителями, представлены в виде массива. Вы можете посетить эту страницу и перейти к разделу «Настройка типов коллекций», чтобы узнать, как создать пользовательскую коллекцию и предоставить ее в контракте, или посмотреть это руководство