2016-09-13 22 views
0

私はVS2015のVBで単純なWeb API 2を作成しようとしています。しかし、私が行ったコードは、という単純な文字列を返すだけです。Web APIがシリアル化されたデータを返すようにXMLまたはJSONを返すことができます。タイプSystem.Collections.Generic.IEnumerableのオブジェクトをキャストできません - Web 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「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を入力するタイプ 'TestApp.widgetModelClass' のオブジェクトをキャストします引数、CancellationToken cancellationToken) ---例外がスローされた前の場所からのスタックトレースの終了--- でSystem.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク 例外がスローされた System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNextで System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotificationでタスク)(タスク タスク)() ---以前の位置からスタックトレースの終わり--- System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNextでSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)で System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)で() ---例外がスローされた前の場所からのスタックトレースの終了--- でSystem.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク0123あなたのサンプルで System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()

+2

あなたは、単一の 'widgetModelClass'が戻ってきているため、エラーがありますこれは 'IEnumerable(Of widgetModelClass)'ではありません。あなたは単一の項目でリストを返すことができます: 'Return new List(Of widgetModelClass)()From {widgetObj}' ...しかし、私はこのことで混乱します: "以下のような作品です。 {"Name": "bottle"、 "ID":1} "を返します。これは、JSONを返すJSONを返します。データ。 – Mark

+0

私は同意しません。適切なJSONは[{"Name": "bottle"、 "ID":1}]です。しかし、リストを返すことは機能します。 –

+0

これはオブジェクトの配列のJSONです。 []がなければ、単一のオブジェクトに対して完全に有効なJSONです。 – Mark

答えて

1

で System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)でタスク)あなたはwidgetObj返すが、それをあなたが望むようにIEnumerable(Of widgetModelClass)のインスタンスではありません。

あなたはwidgetModelClassの1 instanse返すように宣言を変更する必要があります。IEnumerable(Of widgetModelClass)を返すために

Public Function GetValues() As widgetModelClass 
    Return widgetObj 
End Function 

たり、return文を:

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

リストを返すとJSONとXMLの両方の型をリクエストできました。 JSONだけがあなたの1番目の宣言を返します。 –

関連する問題