2016-09-13 2 views
0

So versuche ich, eine einfache Web-API 2 mit VB in VS2015 zu erstellen. Jedoch der Code, den ich funktionierte, gibt nur eine einfache Zeichenkette zurück, wo die Web API serialisierte Daten erwartet, also könnte XML oder JSON zurückgegeben werden.Kann Objekt des Typs System.Collections.Generic.IEnumerable nicht umwandeln - Web-API-Problem

'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 

Der Code unten nicht mit Ausnahme:

Unable System.Collections.Generic.IEnumerable

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

Ich habe definiert mein Objekt vom Typ werfen Modellklasse wie folgt

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 

Die vollständige Fehlermeldung:

ein Fehler occurred.Unable gegossen Objekt vom Typ '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 Typ 2 Argumente, CancellationToken cancellationToken) --- Ende des Stack-Trace von früheren Speicherort, wo Ausnahme ausgelöst wurde --- um System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task Aufgabe) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabe Aufgabe) bei System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext() --- Ende des Stack-Trace aus früheren Stelle, wo Ausnahme ausgelöst wurde --- bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Aufgabe Aufgabe) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabe Aufgabe) bei System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext() --- Ende des Stack-Trace vom vorherigen Speicherort, an dem die Ausnahme ausgelöst wurde --- unter System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task Aufgabe) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabe Aufgabe) bei System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()

+2

Der Fehler ist, weil Sie eine einzelne 'widgetModelClass' zurückkehren , was kein 'IEnumerable (Of widgetModelClass)' ist.Du könntest eine Liste mit dem einzigen Item zurückgeben: 'Neue Liste (von widgetModelClass)() Von {widgetObj}' ... jedoch bin ich dadurch verwirrt: "Beliebige Art funktioniert, aber gibt einfach eine Zeichenkette statt der serialisierte Daten für XML oder JSON sollte die Web-API zurückgeben, es gibt zurück: {"Name": "bottle", "ID": 1} ", was für mich klingt, als ob es genau das tut, was Sie wollen, dh es gibt JSON zurück Daten. – Mark

+0

Ich stimme nicht zu: richtige JSON ist: [{"Name": "Flasche", "ID": 1}]. Die Rückgabe der Liste funktioniert jedoch. –

+0

Das ist JSON für ein Array von Objekten. Ohne [] ist JSON für ein einzelnes Objekt einwandfrei gültig. – Mark

Antwort

1

In Ihrer Probe zurückkehren Sie widgetObj aber es ist nicht von der IEnumerable(Of widgetModelClass) wie Sie wollen.

Sie haben Erklärung ändern ein instanse der widgetModelClass zurückzukehren:

Public Function GetValues() As widgetModelClass 
    Return widgetObj 
End Function 

oder Ihre Rückkehr Anweisung zurückzukehren IEnumerable(Of widgetModelClass):

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

Rückgabe der Liste funktionierte und ich konnte sowohl JSON und XML-Typen anfordern. Nur JSON würde mit Ihrer ersten Deklaration zurückkehren. –

Verwandte Themen