ServiceStackのルーティングの一部は、最初の Web サイトの説明 wikiページで説明されています。
[Route("/hello/{Name}")]
のみ一致:
/hello/name
一方:
[Route("/hello")]
一致:
/hello?Name=XXX
注: QueryString、FormData、および HTTP Request Body は Route の一部ではありません (つまり、/path/info のみです) が、すべての Web サービス呼び出しに加えて、Request DTO をさらに設定するために使用できます。
次のようなワイルドカードパスを含むルートを使用します。
[Route("/hello/{Name*}")]
一致:
/hello
/hello/name
/hello/my/name/is/ServiceStack
ワイルドカード ルートを使用する場合のもう 1 つの適切な使用例です。
したがって、一致させるには、これらの両方のルートに一致するルートを登録する必要が/Customers?Key=Value
あり/Customers/{Id}
ます。
Routes
.Add<GetContact>("/Contacts", "GET")
.Add<GetContact>("/Contacts/{ContactId}", "GET")
すべてのサービスの規則ベースのルートを自動登録する方法
また、これに関連して、 AddFromAssembly拡張メソッドを介して自動ルートを登録します。ここで、この単一の呼び出し:
Routes.AddFromAssembly(typeof(MyService).Assembly)
すべてのサービス (指定されたアセンブリ内) を調べてスキャンし、実装したすべての HTTP メソッドに基づいて規則ベースのルートを登録します。たとえばGetContact
、UpdateContact
サービスにId
プロパティがある場合、次のルートが自動的に登録されます。
Routes
.Add<GetContact>("/Contacts", "GET")
.Add<GetContact>("/Contacts/{Id}", "GET")
.Add<UpdateContact>("/Contacts", "POST PUT")
.Add<UpdateContact>("/Contacts/{Id}", "POST PUT")
また、すべての HTTP 動詞の実装を備えた単一のContacts
REST サービスがあれば、次のルートが登録されます。
Routes
.Add<Contacts>("/Contacts", "GET POST PUT DELETE PATCH")
.Add<Contacts>("/Contacts/{Id}", "GET POST PUT DELETE PATCH")
ルーティング解決順序
これについては、 New API Design wikiで詳しく説明されていますが、ルートの選択に使用される重み付けは以下に基づいています。
- 正確なリテラル一致が最初に使用されます
- すべての動詞よりも動詞の完全一致が優先されます
- ルート内の変数が多いほど、重み付けが少なくなります
- ルートの重みが同じ場合、順序はサービス内のアクションの位置または登録順序 (FIFO) によって決定されます。
例については、wikiのSmart Routingセクションを参照してください。
素晴らしいパフォーマンス
多数のルートがあると MVC でのルーティングが遅くなる可能性があるため、 ServiceStack のルーティング実装はハッシュ ルックアップを使用して実装されているため、MVC で発生した可能性のある線形パフォーマンス回帰の問題が発生しないことを指摘する価値があると思います。