RunningCSharp

MS系開発者による、雑多な記事。記事は所属企業とは関係のない、個人の見解です。

VBでASP.net WebAPIを作る

ASP.net+VBでWebApiを作りたい。WebApiは呼ばれたらバッチを実行し、バッチ処理が完了した後にレスポンスを返してほしい。レスポンスは何でもよい。」とリクエストを受けたので、作ってみました。

WebApiの作り方は、下記の記事内容を引用させて頂きます。

blog.okazuki.jp

本記事は、ほとんど上記記事のコードをVBでやってみただけの記事になります。

プロジェクトを作る

空のASP.netプロジェクトを作成します。

f:id:ys-soniclab:20170204210936p:plain

NuGetで「Microsoft ASP.NET Web API 2 Web Host」を追加

f:id:ys-soniclab:20170204211017p:plain

本記事ではv5.2.3を利用しました。

Global.asaxの追加

プロジェクトを右クリックし、「追加」→「新しい項目を追加」を選択し、ダイアログで「Web」→「グローバル アプリケーション クラス」を選択。

f:id:ys-soniclab:20170204211129p:plain

作成された「Global.asax」を開き、下記のようにコードを追加します。

Imports System.Web.SessionState
'追加ここから
Imports System.Web.Http
'追加ここまで

Public Class Global_asax
    Inherits System.Web.HttpApplication

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        ' アプリケーションの起動時に呼び出されます
        '追加ここから
        GlobalConfiguration.Configure(
            Sub(config)
                config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}",
                                           New With {.id = RouteParameter.Optional})
            End Sub)
        '追加ここまで
    End SubEnd Class

ControllerフォルダとControllerクラスの追加

プロジェクトを右クリックし、「追加」→「新しいフォルダー」でフォルダを追加、名前を「Controller」に変更します。 「Controller」フォルダを右クリックし、「追加」→「クラス」でクラスを追加する、名前は「ExecBatchController」とします。

f:id:ys-soniclab:20170204212746p:plain

メソッドの実装

ExecBatchControllerを下記のように書き換えます。 なお、C#ではGetのWebAPIを作成する場合「Get」とするが、VBでは「Get」が予約語であるため、「GetValues」とします。

Imports System.Web.Http

Public Class ExecBatchController
    Inherits ApiController

    Public Function GetValues() As String

        'バッチを実行(test.batはtimeout 20を実行する)
        Dim p As System.Diagnostics.Process =
            System.Diagnostics.Process.Start("C:\\test\\test.bat")
        p.WaitForExit()
        '適当な値を返す
        Return "end process"
    End Function

End Class

実行

実行すると、ブラウザにはエラーが表示されるが、WebAPIは起動しています。

f:id:ys-soniclab:20170204214346p:plain

ブラウザのアドレスバーに「http://localhost:(ポートNo)/api/ExecBatch」と入力すると、バッチが実行されます。

f:id:ys-soniclab:20170204214326p:plain

バッチ終了後、"end process"と文字列が返されます。

f:id:ys-soniclab:20170204214747p:plain