Форум программистов, компьютерный форум, киберфорум
C#: Веб-сервисы, WCF
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
15 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 41

Получение сервисом WCF списка (коллекции)

25.03.2016, 00:21. Показов 5769. Ответов 48
Метки wcf (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Может поможете

Помогите пожалуйста разобраться с сервисом WCF. вопрос нубский таковым я и являюсь
Суть проблемы (цель): Создать метод в WCF который принимает пользовательскую коллекцию.

Предполагается что структура данных будет всегда одинаковой (фиксированной), разница будет только в кол-ве элементов "Customer"
Примерная структура чтобы была вот такой

Пример пакета XML
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<Customers>
    <Customer>
        <CardNumber>...</CardNumber>
        <CustomerInformation>
            <Name>...</Name>
            <FirstName>...</FirstName>
            <Patronymic>...</Patronymic>
            ...
        </CustomerInformation>
        <PostalAddress>
            <PostalCode>...</PostalCode>
            ...
        </PostalAddress>
    </Customer>
    <Customer>
        <CardNumber>...</CardNumber>
        <CustomerInformation>
            <Name>...</Name>
            <FirstName>...</FirstName>
            <Patronymic>...</Patronymic>
            ...
        </CustomerInformation>
        <PostalAddress>
            <PostalCode>...</PostalCode>
            ...
        </PostalAddress>
    </Customer>
    ...
</Customers>

На стороне сервера есть следующий код (часть данных вырезана).
ServiceContract
VB.NET
1
2
3
4
5
6
7
<ServiceContract()>
Public Interface IService
 
    <OperationContract()>
     Function SendCustomerData(ByVal ListCustomers As List(Of CustomList)) As ResultRec
 
End Interface


DataContract
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<DataContract(Name:="Cust_List")>
Public Class CustomList
    <DataMember>
    Public Property Customer As List(Of Customer)
 
End Class
 
<DataContract>
Public Class Customer
 
    <DataMember()>
    Public Property CardNumber() As String
 
    <DataMember()>
    Public Property CustomerInformation() As CustomerInformation
 
    <DataMember()>
    Public Property PostalAddress() As PostalAddress
 
    ' Остальные DataMember удалены
End Class
 
<DataContract>
Public Class CustomerInformation
    <DataMember()>
    Public Property Name() As String
 
    <DataMember()>
    Public Property FirstName() As String
 
    <DataMember()>
    Public Property Patronymic() As String
 
    <DataMember()>
    Public Property Gender() As Gender
 
    <DataMember()>
    Public Property Birthday() As Date
 
    <DataMember()>
    Public Property ExternalConsent() As Consent
 
End Class
 
<DataContract>
Public Class PostalAddress
    <DataMember()>
    Public Property PostalCode() As String
End Class
 
 
Public Enum Gender
    Women = 2
    Men = 3
End Enum


Реализация
VB.NET
1
2
3
Public Function SendCustomerData(ByVal ListCustomers As List(Of CustomList)) As ResultRec Implements IService.SendCustomerData
       ' Выполняю действие с полученной коллекцией 
End Function
На стороне клиента (vb.net) добавляю веб службу и работаю с полученными метаданными.

Выполняю код:
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
 
        Dim webService As New WS.ServiceClient
 
        Dim appCustomer As New WS.CustomerInformation
        appCustomer.Name = "Test Фамилия"
        appCustomer.Patronymic = "ТЕст Отчество"
        appCustomer.FirstName = "Test Имя"
     
        Dim appPostAdress As New WS.PostalAddress
        appPostAdress.PostalCode = "111111"
      
 
        Dim CustomerList As New List(Of WS.Customer)
 
        CustomerList.Add(New WS.Customer() With {
                     .CardNumber = "111111111",
                     .CustomerInformation = appCustomer,
                     .PostalAddress = appPostAdress
                     })
        CustomerList.Add(New WS.Customer() With {
                     .CardNumber = "22222222",
                     .CustomerInformation = appCustomer,                     
                     .PostalAddress = appPostAdress                     
                      })
 
        Dim answer As New WS.ResultRec
        answer = webService.SendCustomerData(CustomerList)
 
    End Sub
End Class

Вот на этой строке
VB.NET
1
answer = webService.SendCustomerData(CustomerList)
Выдает ошибку:
Ошибка BC30311 Значение типа "List(Of Customer)" невозможно преобразовать в "Cust_List()".

Что я делаю не так?

Может кто скинет аналогичный пример

Добавлено через 5 минут
Пытался разобраться с KnownTypeAttribute так и не вышло
все примеры которые рассматривал они на Шарпе, после конвертации кода может что-то теряется... в общем крутил вертел одни сплошные ошибки
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.03.2016, 00:21
Ответы с готовыми решениями:

Получение новой коллекции путем фильтрации элементов коллекции находящихся в другой коллекции
Всем привет, нуждаюсь в помощи знатоков) Имеется вот такая иерархия если представить в JSON: { teachers: ...

Получение bitmap из WCF
Всем привет. Мне надо получить файл (картинка) из веб сервиса. Как это можно реализовать?

Получение данных от сервера WCF
проблема смешная, но решить я ее не могу. Сводится она скорее всего к тому, куда прикрутить this в методе Программа простейшая...

48
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.04.2016, 20:04
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Mitsuder Посмотреть сообщение
где же мне найти это определение контракта?
Его даже на вашем скрине видно)) ServiceReferences >> CarService >> и дальше раскрывайте и щелкните два раза.
1
0 / 0 / 0
Регистрация: 19.02.2016
Сообщений: 11
05.04.2016, 21:08
Как я понял, Reference.cs... Ох и не просто же было его найти! Спасибо большое за помощь!
0
27 / 27 / 10
Регистрация: 18.08.2014
Сообщений: 212
15.07.2016, 15:21
Доброго дня...
Имеется приложение Silverlight. Также создал веб-службу по шаблону Служба WCF с поддержкой Silverlight.
При создании OperationContract методов, с использованием базовых типов, с добавлением ссылки на службу проблем нет и все работает. Если использовать к примеру List<string> то при добавлении ссылки, то

Code
1
2
3
4
Предупреждение    1   Предупреждение специального инструмента: Не удается импортировать wsdl:portType
Подробности: Сгенерировано исключение во время запуска расширения импорта WSDL: System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Ошибка: Адресат вызова создал исключение.
XPath к источнику ошибки: //wsdl:definitions[@targetNamespace='OtherNamespase']/wsdl:portType[@name='DbLinkService']    D:\Projects\ECMS\ECMS\Service References\DbRef\Reference.svcmap 1   1   ECMS
Пример
C#
1
2
3
4
5
        [OperationContract]
        public DbCommand GetFromDb(string procedureName, Dictionary<string, object> parameters = null, string cursorName = "REFCUR")
        {
            return _dbClient.ReadProcedure(procedureName, parameters, cursorName);
        }
Подскажите как правильно передавать/возвращать в методы сервиса
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
15.07.2016, 16:01
FroztBal, у вас возвращаемый тип - DbCommand. Он не сериализуется, следовательно, передать его невозможно. Да и смысла в этом я не вижу. Опишите задачу подробнее, уверен есть более правильное решение.
0
27 / 27 / 10
Регистрация: 18.08.2014
Сообщений: 212
15.07.2016, 21:58
Есть приложение silverlight которое общается с БД Oracle, чтение/запись. Часть логики реализована на PL\SQL.
Пересмотрел уроки по веб-службам. Пытался DomainService использовать, но почему-то в моей VS2013U отсутствует шаблон DomainService, а шаблон Open RIA WCF DomainService не открывается вываливается ошибка. Поэтому решил воспользоваться шаблоном Служба WCF с поддержкой Silverlight.

На стороне сервера есть класс для работы с БД в нем два метода:

Кликните здесь для просмотра всего текста


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public void WriteProcedure(string procedureName, Dictionary<string, object> parameters = null, Dictionary<string, object> outputparameters = null)
        {
            try
            {
                var oraCmd = OraConn.CreateCommand();
                oraCmd.CommandText = procedureName;
                oraCmd.CommandType = CommandType.StoredProcedure;
                if (parameters != null)
                    foreach (var parameter in parameters)
                    {
                        var param = new OracleParameter(parameter.Key, GetDbType(parameter.Value));
                        param.Value = parameter.Value;
                        param.Direction = ParameterDirection.Input;
                        oraCmd.Parameters.Add(param);
                    }
                if (outputparameters != null)
                    foreach (var parameter in outputparameters)
                    {
                        var param = new OracleParameter(parameter.Key, GetDbType(parameter.Value));
                        param.Direction = ParameterDirection.Output;
                        oraCmd.Parameters.Add(param);
                    }
 
 
                oraCmd.ExecuteNonQuery();
                if (outputparameters != null)
                {
                    foreach (OracleParameter parameter in oraCmd.Parameters)
                    {
                        outputparameters[parameter.ParameterName] = parameter.Value;
                    }
                }
            }
            catch (Exception)
            {
                
            }
        }
 
        public DbCommand ReadProcedure(string procedureName, Dictionary<string, object> parameters = null, string cursorName = "REFCUR")
        {
            var oraCmd = OraConn.CreateCommand();
            try
            {
                oraCmd.CommandText = procedureName;
                oraCmd.CommandType = CommandType.StoredProcedure;
                if (parameters != null)
                    foreach (var parameter in parameters)
                    {
                        var param = new OracleParameter(parameter.Key, GetDbType(parameter.Value));
                        param.Value = parameter.Value;
                        param.Direction = ParameterDirection.Input;
                        oraCmd.Parameters.Add(param);
                    }
 
                if (!string.IsNullOrEmpty(cursorName))
                {
                    OracleParameter oraParam = new OracleParameter(cursorName, OracleDbType.RefCursor)
                    {
                        Direction = ParameterDirection.Output
                    };
                    oraCmd.Parameters.Add(oraParam);
                }
            }
            catch (Exception)
            {
               
            }
            return oraCmd;
        }


С клиента в случае записи в БД нужно передать название процедуры и параметры
В случае получения данных нужно передать название процедуры и параметры и получить от сервера данные
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
16.07.2016, 04:32
FroztBal, самое первое что необходимо сделать - это определить контракты данных, которые вы планируете передавать между клиентом и сервером. После этого уже продумать логику работы с БД. При желании можно вообще не заморачиваться реализацией под конкретного провайдера данных, а сделать общую логику, для каждого провайдера написать свою dll, через которую и взаимодействовать с БД.
0
27 / 27 / 10
Регистрация: 18.08.2014
Сообщений: 212
18.07.2016, 11:13
Есть контракт
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
        [OperationContract]
 
        public List<string> Test()
        {
            return new List<string> { "test" };
        }


При попытке добавить ссылку на службу:
Вложение 718250
Убираю этот контракт, остаются только контракты с базовыми типами, все нормально.
0
27 / 27 / 10
Регистрация: 18.08.2014
Сообщений: 212
18.07.2016, 12:48
Еще раз картинка
Миниатюры
Получение сервисом WCF списка (коллекции)  
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
18.07.2016, 14:58
FroztBal, я что-то не пойму вас.
В первом вопросе вы показали два метода, а сейчас показываете контракт, ничего общего с этими методами не имеющий. Как вас понимать?
0
27 / 27 / 10
Регистрация: 18.08.2014
Сообщений: 212
18.07.2016, 15:52
Я столкнулся с проблемой контрактов возвращающих список. Сама технология WCF позволяет работу со списками, но при построении линка на службу вываливаются ошибки и, как следствие, линк не создается. Происходит это только в случае использования списка.
Кликните здесь для просмотра всего текста

Предупреждение 1 Предупреждение специального инструмента: Не удается импортировать wsdl:portType
Подробности: Сгенерировано исключение во время запуска расширения импорта WSDL: System.ServiceModel.Description.DataCont ractSerializerMessageContractImporter
Ошибка: Адресат вызова создал исключение.
XPath к источнику ошибки: //wsdl:definitions[@targetNamespace='']/wsdl:portType[@name='DbLinkService'] D:\Projects\ECMS\ECMS\Service References\ServiceLink\Reference.svcmap 1 1 ECMS
Предупреждение 2 Предупреждение специального инструмента: Не удается импортировать wsdl:binding
Подробности: Ошибка импорта wsdl:portType, от которого зависит wsdl:binding.
XPath к wsdl:portType: //wsdl:definitions[@targetNamespace='']/wsdl:portType[@name='DbLinkService']
XPath к источнику ошибки: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='CustomBinding_DbLinkService'] D:\Projects\ECMS\ECMS\Service References\ServiceLink\Reference.svcmap 1 1 ECMS
Предупреждение 3 Предупреждение специального инструмента: Не удается импортировать wsdl:port
Подробности: Ошибка импорта wsdl:binding, от которого зависит wsdl:port.
XPath к wsdl:binding: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='CustomBinding_DbLinkService']
XPath к источнику ошибки: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:service[@name='DbLinkService']/wsdl:port[@name='CustomBinding_DbLinkService'] D:\Projects\ECMS\ECMS\Service References\ServiceLink\Reference.svcmap 1 1 ECMS
Предупреждение 4 Предупреждение специального инструмента: Не найдены конечные точки, совместимые с Silverlight 5. Созданный класс клиента будет невозможно использовать, если сведения о конечных точках не будут предоставляться через конструктор. D:\Projects\ECMS\ECMS\Service References\ServiceLink\Reference.svcmap 1 1 ECMS
Предупреждение 5 Предупреждение специального инструмента: Адресат вызова создал исключение. D:\Projects\ECMS\ECMS\Service References\ServiceLink\Reference.svcmap 1 1 ECMS
Ошибка 6 Ошибка специального инструмента: Не удалось создать код для ссылки на службу "ServiceLink". Подробности см. в других сообщениях об ошибках и предупреждениях. D:\Projects\ECMS\ECMS\Service References\ServiceLink\Reference.svcmap 1 1 ECMS

Я никак не пойму, что я делаю не так
Во вложении шаблон создания службы и способ добавления в клиент
Миниатюры
Получение сервисом WCF списка (коллекции)   Получение сервисом WCF списка (коллекции)  
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
18.07.2016, 23:04
Цитата Сообщение от FroztBal Посмотреть сообщение
шаблон создания службы
Что-то у меня (VS 2015 Professional) такого нет. У вас какая версия Студии?
0
27 / 27 / 10
Регистрация: 18.08.2014
Сообщений: 212
19.07.2016, 06:18
VS 2013
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
19.07.2016, 10:41
Цитата Сообщение от FroztBal Посмотреть сообщение
VS 2013
Хм... Очень странно. У меня ни в 2010, ни в 2015 такого шаблона нет. Вы его отдельно загружали или он шел вместе со Студией?
0
27 / 27 / 10
Регистрация: 18.08.2014
Сообщений: 212
19.07.2016, 11:55
Скорее всего он поставился либо со Silverlight Dev Tool.

Добавлено через 1 час 13 минут
Поставил 15 студию, Создал проект Silvelight Application с поддержкой RIA WCF (галочка), добавил в проект службу по шаблону WCF Service. Создал один единственный метод с (List<string>) и решил создать Service Reference .... Ошибка аналогична той, которую я указал ранее.
C#
1
2
3
4
        public List<string> DoWork()
        {
            return new List<string> { "test" };
        }
0
27 / 27 / 10
Регистрация: 18.08.2014
Сообщений: 212
19.07.2016, 13:17
Прикрепил проект. Нужно выполнить обновление на ServiceReference1
А если удалить метод RetList, потом собрать проект и выполнить обновление то будет все ок.
Вложения
Тип файла: 7z TEstoviy.7z (529.6 Кб, 2 просмотров)
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
19.07.2016, 13:40
FroztBal, к сожалению, проект не запускается... Говорит, что нужно Silverlight Dev Tool или типа того.
0
27 / 27 / 10
Регистрация: 18.08.2014
Сообщений: 212
19.07.2016, 13:41
При установке 15 студии их можно было включить в установку
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
19.07.2016, 13:49
Цитата Сообщение от FroztBal Посмотреть сообщение
При установке 15 студии их можно было включить в установку
Кто бы знал...
Но в обычном сервисе такой код точно работает (WCF маршализирует коллекцию как массив), это проверено. Значит, проблема именно в работе Silverlight.
0
27 / 27 / 10
Регистрация: 18.08.2014
Сообщений: 212
19.07.2016, 13:50
брал пример тут
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
19.07.2016, 14:25
FroztBal, ну в общем сделал так. Создал обычное Silverlight приложение, а потом добавил в него службу WCF. Добавил в службу метод с нужной сигнатурой, сейчас попробую добавить ссылку.

Добавлено через 11 минут
Результат - создал консольку, ссылка отлично добавляется. Так что проблема в чем-то еще. Попробуйте сделать так как у меня и проверьте.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.07.2016, 14:25

Отправка и получение WCF Service Soap
Приветствую всех! Сразу скажу - никогда не работал с WCF и SOAP. Поступила задача сделать следующее: сделать WCF Service работающий по...

DataContext и получение таблицы клиентом через WCF
Доброй всем день, не могу получить столбец таблицы/всю таблицу от сервера. Не понимаю в чем причина. Выбивает CommunicationException:...

Получение коллекции Rails в JS
Мне нужно получить коллекцию @posts в application.js, чтобы дальше обработать ее angularjs'ом. Подскажите, пожалуйста, как это можно...

Получение коллекции из бд sqlite
Доброго времени суток. Есть класс бд: package ru.myscanner.scannerth; import android.content.ContentValues; import...

Получение и возвращение неопределенной коллекции
Для начала, если кто то придумает название более информативное буду благодарен. Мне надо два метода, они оба будут работать с файлами...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru