2015年1月30日金曜日

ASP.NET WebAPI で .do な呼び出しに対応する

色々ありまして。

ちょっとしたお仕事上の都合で、現在 struts で用意している Java 製の API 群をどうすればリプレースしやすいか考えていてふと思いついたので試してみました。

やろうとしている事は簡単で、~.do で呼び出された際に Struts ではなく ASP.NET WebAPI で動作させるというものです。そうすることでアプリ側の改修なしにサーバー側をまるっとリプレースすることも選択肢とすることができます。

image

とりあえず WebAPI なプロジェクトを新規に用意します。今回はサンプルですので認証は利用しません。まず最初に行う事は WebAPI 用のコントローラの準備です。

image

今回は空の WebAPI コントローラを利用しますが、どれでも構いません。今回は次のような API を用意します。

   1: Imports System.Net
   2: Imports System.Web.Http
   3:  
   4: Namespace Controllers
   5:     Public Class DoSampleController
   6:         Inherits ApiController
   7:  
   8:         <HttpGet>
   9:         Public Function Exec1() As String()
  10:             Return New String() {"Sample API", "8888"}
  11:         End Function
  12:  
  13:     End Class
  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: Public Module WebApiConfig
   7:     Public Sub 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:=New With {.controller = "DoSample"}
  17:         )
  18:     End Sub
  19: End Module

記載したのは 13 行目から 17 行目の部分で、http://(サーバー)/test/~.do とアクセスした際に呼び出されるような設定となります。

通常であればこれくらいで終わるのですが、今回は ~.do という形式にあるように、静的ファイルへのアクセスと近い形式になり、そのままでは IIS がデフォルトで対応していない拡張子の為、404 エラーとなってしまいます。


   1: <system.webServer>
   2:   <handlers>
   3:     <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
   4:     <remove name="OPTIONSVerbHandler" />
   5:     <remove name="TRACEVerbHandler" />
   6:     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
   7:     <add name="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 が呼び出されるようになるので、サーバーをまるっと入れ替えることも可能です。

0 件のコメント:

コメントを投稿