2016-09-13 4 views
0

Так что я пытаюсь создать простой веб-API 2 с VB в VS2015. Однако код, который я получил, работает возвращает только простую строку, где Web Api ожидает сериализованные данные, чтобы можно было вернуть XML или JSON.Невозможно лить объект типа System.Collections.Generic.IEnumerable - проблема веб-API

'Here I initialize and populate my object  
Public widgetObj As New widgetModelClass("bottle", 1) 


' Below kind of works, but simply returns a string **instead** of 
' the serialized data for XML or JSON the Web API should return. 
' it returns: {"Name":"bottle","ID":1} 
Public Function GetValues() As widgetModelClass 
    Return widgetObj 
End Function 

Код ниже не удается за исключением:

Невозможно привести объект типа System.Collections.Generic.IEnumerable

Public Function GetValues() As IEnumerable(Of widgetModelClass) 
    Return widgetObj 
End Function 

Я определил мой класс модели следующим образом:

Public Class widgetModelClass 
    Public Sub New(ByVal name As String, ByVal id As Integer) 
     Me.Name = name 
     Me.ID = id 
    End Sub 

    Private m_Name As String 
    Public Property Name() As String 
     Get 
      Return m_Name 
     End Get 
     Set 
      m_Name = Value 
     End Set 
    End Property 

    Private m_ID As Integer 
    Public Property ID() As Integer 
     Get 
      Return m_ID 
     End Get 
     Set 
      m_ID = Value 
     End Set 
    End Property 
End Class 

полное сообщение об ошибке:

ошибка имеет occurred.Unable привести объект типа 'TestApp.widgetModelClass' к типу «System.Collections.Generic.IEnumerable 1[TestApp.widgetModelClass]'.</ExceptionMessage><ExceptionType>System.InvalidCastException</ExceptionType><StackTrace> at lambda_method(Closure , Object , Object[]) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary 2 аргументы, CancellationToken cancelationToken) --- Конец трассировки стека из предыдущего места, где исключение было выбрано --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task задачи) на System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext() --- Конец трассировки стеки из предыдущего места, где было брошено исключение --- у System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) при System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) при System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext() --- Конец трассировки стека из предыдущего места, где было выбрано исключение - System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача задача) на System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task задач) на System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()

+2

Ошибка происходит потому, что вы возвращаете один 'widgetModelClass' , который не является 'IEnumerable (Of widgetModelClass)'.Вы можете вернуть список с единственным элементом: «Возвратить новый список (из widgetModelClass)() Из {widgetObj}' ... однако я смущен этим: «Ниже вид работ, но просто возвращает строку вместо сериализованные данные для XML или JSON, которые должен вернуть Web API, он возвращает: {"Name": "bottle", "ID": 1} ", что для меня звучит так, будто оно делает именно то, что вы хотите, т.е. оно возвращает JSON данные. – Mark

+0

Я не согласен: надлежащий JSON есть: [{"Name": "bottle", "ID": 1}]. Однако возврат списка действительно работает. –

+0

Это JSON для массива объектов. Без [] отлично действует JSON для одного объекта. – Mark

ответ

1

В вашей выборке вы возвращаетесь widgetObj, но это не является событием IEnumerable(Of widgetModelClass), как вы хотите.

Вы должны изменить декларацию вернуть один instanse в widgetModelClass:

Public Function GetValues() As widgetModelClass 
    Return widgetObj 
End Function 

или ваш оператор возврата для возврата IEnumerable(Of widgetModelClass):

Public Function GetValues() As IEnumerable(Of widgetModelClass) 
    Return New List(Of widgetModelClass)(New widgetModelClass() { widgetObj }) 
End Function 
+0

Возврат списка работал, и я мог запросить как JSON, так и типы XML. Только JSON вернется с вашей первой декларацией. –