.NET 4からっぽいWCFのルーティング
クライアントとサーバーの間に挟まってまさにルーターになるための
RoutingServiceクラス(System.ServiceModel.Routing, System.ServiceModel.Rouging, Version=4.0.0.0.)
なんてものが用意されている。
これを使うとほんとにルーターみたいに受け取ったアドレスやらメッセージから
本来行くべき場所のアドレスにスルーパスしてくれる感じ。
なので、ルーターとして動いているサービスと実際にリクエストを処理するサービスの2つがあるイメージ。
IISでホストすれば当然、両サービスへのアクセス履歴が残る。
一方、ASP.NET Routingと連動するために用意されている
ServiceRouteクラス(System.ServiceModel.Activation, System.ServiceModel.Activation, Version=4.0.0.0)
なんてものもある。
こっちの場合は、WCFをASP.NET互換モードで動かして、
Global.asaxのApplication_Startメソッドで、
RouteTable.Routesに新しいルーティング定義を追加する。
RouteTable.Routes.Add(new ServiceRourte(“Service”, new ServiceHostFactory(), typeof(IService));
のような感じ。
クライアントからは以下のようなアドレスでアクセスできる。
http://localhost/WCF/Service
ServiceRouteの第一引数とURLの末尾が一致すると、
このルート定義が使われて、
ServiceHostFactory(ServiceHostFactoryBaseを継承して自分で作る必要あり)で
ホスティング環境が起動し、
IServiceコントラクトの実際のサービスが呼び出される仕組み。
こっちの場合は、ASP.NETランタイム内でディスパッチされてるから
IISのアクセスログとしては、「http://localhost/WCF/Service」しか残らない。
もう少し応用すれば、ASP.NET MVCのルーティングみたいに
http://localhost/App/Category/2
とかのURLをディスパッチして、特定のWCFサービスに渡すとかできそうだけど
なんか、それは果てしなく難しそうなのと、それにあまり意味がなさそう・・・。