2

假设我从服务堆栈示例中定义了 Hello World Web 服务,但我不只是将其称为 /hello/{name},而是希望能够将其称为 /hello/{name}/id,其中我将 id 定义为一个单独的参数(通过将其存储在 refId 中,在 CustomUserSession 中)。

换句话说,我想将身份验证和实际的 Web 服务调用分成两部分,但我不想在实际的 Web 服务调用中公开这个 id,因为这是私有的,只在我的系统内。我该怎么做呢?我理想的工作流程是:

  • 客户端调用网络服务:/hello/{name}
  • 身份验证发生。作为此身份验证的一部分,我得到了这个秘密 ID
  • 我现在将 Web 服务称为 /hello/{name}/id

就好像我想从另一个 Web 服务中调用一个 Web 服务一样。

如果这似乎是一个被误导的问题,我深表歉意,但我该如何实现这个工作流程?

谢谢

4

1 回答 1

3

我建议看一下ServiceStack routing。您的服务只有在匹配现有路由(或使用预定义路由)时才会被调用,这意味着如果您只有:

 [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如果您的 Request DTO 有一个id属性,将让您调用该服务secret。如果您没有(或不想)拥有 id 属性,您仍然可以使用以下方式访问参数:

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

但是由于您希望将其隐藏,您可能应该避免将其传递到每个人都可见的 url(包括网络代理、http 日志和其他中间件)。隐藏参数的更好地方是将其作为自定义 HTTP 标头传递,例如:X-id: secret您可以通过以下方式在服务中访问它:

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