2

サービス スタックの例から、Hello World Web サービスを定義したとしますが、それを単に /hello/{name} として呼び出すのではなく、/hello/{name}/id として呼び出すことができるようにしたいと考えています。 id を別のパラメーターとして定義します (CustomUserSession 内の refId に格納することにより)。

つまり、認証と実際の Web サービス呼び出しを 2 つの部分に分割したいのですが、この ID を実際の Web サービス呼び出しで公開したくありません。これはシステム内でのみプライベートであるためです。どうすればこれを行うことができますか?私の理想的なワークフローは次のとおりです。

  • クライアントは Web サービスを呼び出します: /hello/{name}
  • 認証が発生します。この認証の一環として、このシークレット ID を取得します
  • /hello/{name}/id として Web サービスを呼び出すようになりました

それはまるで別の Web サービス内から Web サービスを呼び出したいかのようです。

これが見当違いの質問のように思われる場合は申し訳ありませんが、このワークフローを実現するにはどうすればよいですか?

ありがとう

4

1 に答える 1

3

ServiceStack ルーティングをご覧になることをお勧めします。サービスは、既存のルートに一致する (または事前定義されたルートを使用する) 場合にのみ呼び出されます。

 [Route("/hello/{name}")]

それは一致/hello/{name}/{id}せず、サービスは呼び出されません。そのルートに一致させるには、明示的なルートを指定できます。たとえば、次のようになります。

 [Route("/hello/{name}/{id}")]

しかし、これはあなたが隠したいと言っている公開情報です。別の方法は、ワイルドカード ルートを使用することです。

 [Route("/hello/{name*}")]

任意の/hello/*ルート株式会社に一致します。/hello, /hello/foo, /hello/foo/id, /hello/foo/id/and/more/etc.

ただし、Hello.Nameプロパティに入力されるものfoo/idは、サービスで検出して解析する必要があるものです。

別の方法として、QueryString または POST されたフォーム パラメータで非表示の ID を指定する方法があります。これを ServiceStack で使用して、元のルートなどを使用して、リクエスト DTO をさらに設定できます。

 [Route("/hello/{name}")]

/route/foo?id=secretリクエスト DTO にidプロパティが設定されている場合に、サービスを呼び出すことができますsecret。id プロパティを持っていなかった (または持ちたくない) 場合でも、次の方法でパラメーターにアクセスできます。

base.Request.QueryString["id"];
base.Request.FormData["id"];

しかし、これを非表示にしたいので、誰もが見ることができる URL (Web プロキシ、http ログ、およびその他のミドルウェアを含む) でそれを渡すことはおそらく避けるべきです。パラメーターを非表示にするより良い場所は、カスタム HTTP ヘッダーとして渡すことです。たとえば、次X-id: secretのようにサービスでアクセスできます。

base.Request.Headers["X-id"];
于 2013-02-12T21:35:52.023 に答える