これまでのプロジェクトにWeb API を実装する
Web API 2.2をインストール
WebApiConfig.vbの登録先
リレーショナルシップを必要とするデータはJSON形式に受け入れられないため、新規モデルの追加
1.Web API 2.2をインストール/System.Web.Httpを参照設定すること
これによりApiControllerが使用可能となる
Controllerの名前空間
System.Web.Mvc.Controller
System.Web.Http.ApiController
リスト8-34
※ArticleApiについては、この項最後
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web.Http
Namespace Controllers
Public Class ArticlesApiController 'ArticlesControllerではクラス名がバッティングするので
Inherits ApiController
Private db As New MvcViewContext
Function GetArticlesByCategory(ByVal id As CategoryEnum) As IEnumerable(Of ArticleApi)
Dim articles = db.Articles.Where(Function(a) a.Category = id).OrderBy(Function(a) a.Published) _
.Select(Function(a) New ArticleApi With {.Url = a.Url,
.Title = a.Title,
.Category = a.Category,
.Description = a.Description,
.Viewcount = a.Viewcount,
.Published = a.Published,
.Released = a.Released,
.Timestamp = a.Timestamp})
Return articles
End Function
End Class
End Namespace
2.WebApiConfig.vbの登録先
リスト8-35
Imports System.Web.Routing
Imports System.Net
Imports System.Web.Http
Module WebApiConfig
Public Sub Register(ByVal config As HttpConfiguration)
'以下インテリセンスが働かないときがあった
config.MapHttpAttributeRoutes()
config.Routes.MapHttpRoute(
name:="DefaultApi",
routeTemplate:="api/{controller}/{id}",
defaults:=New With {.id = RouteParameter.Optional})
End Sub
End Module
Global.asax.vbに太字部分を追加
Protected Sub Application_Start()
AreaRegistration.RegisterAllAreas()
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters)
GlobalConfiguration.Configure(AddressOf WebApiConfig.Register)
RouteConfig.RegisterRoutes(RouteTable.Routes)
BundleConfig.RegisterBundles(BundleTable.Bundles)
・・・中略・・・
3.リレーショナルシップを必要とするデータはJSON形式に受け入れられないため、新規モデルの追加
尚、デフォルトの設定ではAdvanced REST clientから詳細なエラー情報が得られないためWeb.configに太字部分を修正または追加
・・・中略・・・
<system.web>
<authentication mode="None" />
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<customErrors mode="Off" />
・・・中略・・・
<system.webServer>
<httpErrors errorMode="Detailed" />
<modules>
<remove name="FormsAuthenticationModule" />
</modules>
・・・中略・・・
//参考
Rick Barber's Blog /Tips for finding the real error
http://blogs.iis.net/rickbarber/working-past-500-internal-server-error
JSON形式に対応させるためのモデル
Models/ArticlesApi.vbを追加
Public Class ArticleApi
Public Property Id As Integer
Public Property Url As String
Public Property Title As String
Public Property Category As CategoryEnum
Public Property Description As String
Public Property Viewcount As Integer
Public Property Published As DateTime
Public Property Released As Boolean
Public Property Timestamp As Byte()
End Class
※モデルにOverridable PropertyがあるとAdvanced REST clientでエラーとなるための措置
※リレーショナルシップを必要とするデータはJSON形式に馴染まない模様