色々ありまして。
ちょっとしたお仕事上の都合で、現在 struts で用意している Java 製の API 群をどうすればリプレースしやすいか考えていてふと思いついたので試してみました。
やろうとしている事は簡単で、~.do で呼び出された際に Struts ではなく ASP.NET WebAPI で動作させるというものです。そうすることでアプリ側の改修なしにサーバー側をまるっとリプレースすることも選択肢とすることができます。
とりあえず WebAPI なプロジェクトを新規に用意します。今回はサンプルですので認証は利用しません。まず最初に行う事は WebAPI 用のコントローラの準備です。
今回は空の WebAPI コントローラを利用しますが、どれでも構いません。今回は次のような API を用意します。
1:Imports System.Net
2:Imports System.Web.Http
3:
4:Namespace Controllers
5:PublicClass DoSampleController
6:Inherits ApiController
7:
8:<HttpGet>
9:PublicFunction Exec1() AsString()
10:ReturnNewString() {"Sample API", "8888"}
11:EndFunction
12:
13:EndClass
14:End Namespace
これで API 本体は準備できたので、次に WebApiConfig の中で行われている WebAPI 用のルーティング設定を修正し、先ほどの API が呼び出されるようなルーティングを設定します。
1:Imports System
2:Imports System.Collections.Generic
3:Imports System.Linq
4:Imports System.Web.Http
5:
6:PublicModule WebApiConfig
7:PublicSub Register(ByVal config As HttpConfiguration)
8:' Web API の設定およびサービス
9:
10:' Web API ルート
11: config.MapHttpAttributeRoutes()
12:
13: config.Routes.MapHttpRoute(
14: name:="DefaultApi",
15: routeTemplate:="ht/{action}.do",
16: defaults:=NewWith {.controller = "DoSample"}
17: )
18:EndSub
19:End Module
記載したのは 13 行目から 17 行目の部分で、http://(サーバー)/test/~.do とアクセスした際に呼び出されるような設定となります。
通常であればこれくらいで終わるのですが、今回は ~.do という形式にあるように、静的ファイルへのアクセスと近い形式になり、そのままでは IIS がデフォルトで対応していない拡張子の為、404 エラーとなってしまいます。
1:<system.webServer>
2:<handlers>
3:<removename="ExtensionlessUrlHandler-Integrated-4.0"/>
4:<removename="OPTIONSVerbHandler"/>
5:<removename="TRACEVerbHandler"/>
6:<addname="ExtensionlessUrlHandler-Integrated-4.0"path="*."verb="*"type="System.Web.Handlers.TransferRequestHandler"preCondition="integratedMode,runtimeVersionv4.0"/>
7:<addname="DoFileHandler"path="*.do"verb="*"type="System.Web.Handlers.TransferRequestHandler"preCondition="integratedMode,runtimeVersionv4.0"/>
8:</handlers>
9:</system.webServer>
7 行目にて拡張子 .do に対して TransferRequestHandler を指定し、ASP.NET 側で処理を行えるように指定しています。この設定がないと、静的ファイルとして扱われることとなり HttpHandler を利用する方法で対応することになります。
このような感じで WebAPI を実装すると、.do なアドレスにアクセスすることで Struts 上の API と同様に WebAPI が呼び出されるようになるので、サーバーをまるっと入れ替えることも可能です。