Как использовать пользовательский класс для возврата данных из веб-службы - PullRequest
0 голосов
/ 11 февраля 2011

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

Таким образом, после выполнения этого запроса у меня на стороне веб-службы есть ряд имен, пар типов, которые мне нужно сериализовать и отправить обратно моему клиенту.Я мог бы использовать List (of String ()) для отправки значений обратно, но вместо этого я хочу использовать List (из Custom_Class), потому что позже мне придется делать это в гораздо большем масштабе, и я хочу учиться на этой более простой версии.

Теперь я знаю из своего исследования, что я могу создать класс из документа .XSD, так что я думаю, что мне нужно сделать, это преобразовать этот класс в .XSD и каким-то образом отправить его с моим запросом в WebService.так что он может использовать этот .XSD для динамического создания класса во время выполнения, создания экземпляра этого класса в объектах, заполнения этих объектов результирующим набором, объединения его в строго типизированный список (из ReturnFields), сериализации этого в XML, отправки его обратномоему клиенту десериализуйте его обратно и покажите для него.

Итак, 2 вопроса: 1. Я на правильном пути или иду по этому пути совсем неправильно.2. Как передать схему .XSD моему веб-сервису, чтобы он мог использовать ее для создания класса на стороне сервера?


--------------РЕДАКТИРОВАТЬ ----------- Итак, основываясь на мнениях pMartin, я немного пересмотрю этот вопрос.

Итак, ниже приведен мой код в его нынешнем виде.

У меня естькласс «Поля», проживающий на моем уровне библиотеки

Public Class Fields
    Private Field_Name As String
    Private Field_Type As System.Type

    Public Sub New()
    End Sub

    Protected Overrides Sub Finalize()
    End Sub

    Property Name() As String
        Get
            Return Field_Name
        End Get
        Set(ByVal value As String)
            Field_Name = value
        End Set
    End Property

    Property Type() As System.Type
        Get
            Return Field_Type
        End Get
        Set(ByVal value As System.Type)
            Field_Type = value
        End Set
    End Property
End Class

Этот метод используется в моей библиотеке следующим кодом.

Public Function Get_List_Of_Fields(ByVal Table_Name As String, ByVal Database_Name As String) As List(Of Fields)
    Dim List_Of_Fields As New List(Of Fields)
    Dim DataModel As MetaModel = Get_Datamodel(Database_Name)

    Dim Data_Table = (From DataTable In DataModel.GetTables Where DataTable.TableName = Table_Name).FirstOrDefault

    For Each Field In Data_Table.RowType.DataMembers
        Dim Fields_Obj As New Fields
        Fields_Obj.Name = Field.Name
        Fields_Obj.Type = Field.Type
        List_Of_Fields.Add(Fields_Obj)
    Next
    Return List_Of_Fields
End Function

, который возвращается к моему веб-сервису (.ASMX)

<WebMethod()> _
Public Function Get_List_of_Fields(ByVal Table_Name As String, ByVal Database_Name As String) As List(Of Fields)
    Return _DynaLib.Get_List_Of_Fields(Table_Name, Database_Name)
End Function

Что возвращает моему клиенту? Здесь моя ошибка в этой строке «возврата»

Imports Dynamic_Charting.DynamicReference 
Private _DynamicService As New DynamicServiceSoapClient

Public Function Get_List_of_Fields(ByVal Table_name As String, ByVal Database_Name As String) As List(Of Fields)
     Return _DynamicService.Get_List_of_Fields(Table_name, Database_Name)
 End Function

Именно здесь у меня есть ошибка.Я получаю следующую ошибку.

ошибка 11
Значение типа «1-мерный массив Dynamic_Charting.DynamicReference.Fields» не может быть преобразовано в «System.Collections.Generic.List (Of Dynamic_Charting.DynamicReference.Поля).

1 Ответ

0 голосов
/ 11 февраля 2011

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

По сути, у вас будет такое определение для вашего веба.сервисный метод (при условии, что у вас также есть класс InputFields для сбора данных о таблице, выбранной пользователем):

<WebMethod()>
Public Function MyWebMethod(inputData As InputFields) As ReturnFields
    ...
End Function
...