wcf возвращает более одного экземпляра класса клиенту - PullRequest
1 голос
/ 19 мая 2011

Проблема: у меня запущен и работает веб-сервис, проблема в том, что мне нужно вернуть более одного экземпляра класса, и я понятия не имею, как это сделать.

IУ меня есть цикл, настроенный в службе:

If localtab.Rows.Count > 0 Then
            Do While i <= localtab.Rows.Count
                Mbr.Urn = localtab.Rows(i).Item(0) & vbNullString
                Mbr.Title = localtab.Rows(i).Item(1) & vbNullString
                Mbr.Initials = localtab.Rows(i).Item(2) & vbNullString
                Mbr.Surname = localtab.Rows(i).Item(3) & vbNullString
                Mbr.Address1 = localtab.Rows(i).Item(4) & vbNullString
                Mbr.Address2 = localtab.Rows(i).Item(5) & vbNullString
                Mbr.Address3 = localtab.Rows(i).Item(6) & vbNullString
                Mbr.Town = localtab.Rows(i).Item(7) & vbNullString
                Mbr.County = localtab.Rows(i).Item(8) & vbNullString
                Mbr.Country = localtab.Rows(i).Item(9) & vbNullString
                Mbr.Postcode = localtab.Rows(i).Item(10) & vbNullString
                Mbr.msg = "Success"

                i = i + 1
            Loop
        Else
            Mbr.msg = "Fail - no record found"
        End If 

И я знаю, что это прекрасно работает, так как возвращает последний член, указанный в БД.Выполнение чего-то вроде Mbr(i).urn и т.д ... не будет работать, как когда я перебираю цикл через i, он только когда-нибудь вернет первый экземпляр, и как только сервис вернется, он остановится.

Нижеэто код со стороны клиента, вызывающего службу - достаточно просто, все, что я сейчас ищу, - это отображение окна сообщения с каждой фамилией.

Dim abMem As New ArdbegMember
    Dim retMem As ArdbegMember

    abMem.Downloaded = "N"

    Try
        cc.Open()
        retMem = cc.MbrReq(abMem)
        MesgBox(retMem.Surname)
        cc.Close()

Что мне нужно знать, так это какпередать полный набор записей обратно клиенту

РЕДАКТИРОВАТЬ

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

Dim results As List(Of ArdbegMember)
            Dim i As Integer = 0

            'assign values from the table to the ArdbegMember object
            If localtab.Rows.Count > 0 Then
                Do While i <= localtab.Rows.Count
                    Mbr.Urn = localtab.Rows(i).Item(0) & vbNullString
                    Mbr.Title = localtab.Rows(i).Item(1) & vbNullString
                    Mbr.Initials = localtab.Rows(i).Item(2) & vbNullString
                    Mbr.Surname = localtab.Rows(i).Item(3) & vbNullString
                    Mbr.Address1 = localtab.Rows(i).Item(4) & vbNullString
                    Mbr.Address2 = localtab.Rows(i).Item(5) & vbNullString
                    Mbr.Address3 = localtab.Rows(i).Item(6) & vbNullString
                    Mbr.Town = localtab.Rows(i).Item(7) & vbNullString
                    Mbr.County = localtab.Rows(i).Item(8) & vbNullString
                    Mbr.Country = localtab.Rows(i).Item(9) & vbNullString
                    Mbr.Postcode = localtab.Rows(i).Item(10) & vbNullString
                    Mbr.msg = "Success"

                    i = i + 1

                    results.Add(Mbr)
                Loop
            Else
                Mbr.msg = "Fail - no record found"
            End If

            'Tidy up
            dataAdapter.Dispose()
            Cmd.Dispose()
            oConn.Close()

            'Return the ArdbegMember object
            Return results

И теперь выдается ошибка -

Value of type 'System.Collections.Generic.List(Of ArdbegWeb.ArdbegMember)' cannot be converted to 'ArdbegWeb.ArdbegMember'.

Ответы [ 2 ]

2 голосов
/ 19 мая 2011

Вы всегда можете создать службу, которая возвращает List<T>, если вы определите конкретный тип для <T>:

[ServiceContract]
public interface IYourService
{
   [OperationContract]
   public List<ArdbegMember> GetMembers();  
}

Предполагая, что у вас есть класс контракта данных:

[DataContract]
public class ArdbegMember
{
    [DataMember]
    public string Title { get; set; }
    [DataMember]
    public string Initials { get; set; }
    [DataMember]
    public string Surname { get; set; }
    .... (and so forth - define all the properties you need on your `ArdbegMember`)
}

В своей реализации сервиса вы могли бы написать:

public class YourService : IYourService
{
   public List<ArdbegMember> GetMembers()
   {
       List<ArdbegMember> results = new List<ArdbegMember>();

       // load your `localtab` somehow
       foreach(DataRow row in localtab.Rows)
       {
           ArdbegMember member = new ArdbegMember();
           // set the properties, based on the "row"

           results.Add(member);
       }

       return results;
   }  
}

Итак, теперь у вас есть служба WCF с единственным методом, называемым GetMembers() (вы, вероятно, захотите передать некоторые критерии поиска и т. Д. -в вашем реальном сервисе) и возвращает обратно список ArdbegMember объектов.

Некоторые хорошие ресурсы WCF:

Заинтересованы в книге?Я бы порекомендовал Learning WCF Мишель Леру Бустаманте.Она охватывает все необходимые темы и очень понятным и доступным способом.Это научит вас всему - основам, промежуточным темам, безопасности, управлению транзакциями и т. Д. - что вам необходимо знать, чтобы писать высококачественные и полезные сервисы WCF.

Обучение WCF http://ecx.images -amazon.ком / изображений / I / 51rz7yhbyxL._BO2,204,203,200_PIsitb-наклейка-стрелка-клик, TopRight, 35, -76_AA300_SH20_OU01_.jpg

0 голосов
/ 17 июня 2011

Спасибо за вашу помощь, Марк, решение было ослепительно очевидным, и я не должен был его пропустить!

Do While i <= localtab.Rows.Count должен был прочитать Do While i <= localtab.Rows.Count-1. Цикл повторялся сам по себе слишком много раз, вызывая проблемы при попытке вернуть Mbr на клиентскую сторону!

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