gpt4 book ai didi

servicestack - 将参数插入服务堆栈中的 Web 服务调用

转载 作者:行者123 更新时间:2023-12-04 05:11:41 24 4
gpt4 key购买 nike

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

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

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

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

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

    谢谢

    最佳答案

    我建议看看 ServiceStack routing .您的服务只有在匹配现有路由(或使用 pre-defined route )时才会被调用,这意味着如果您只有:

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

    不匹配 /hello/{name}/{id}并且您的服务不会被调用。要匹配该路由,您可以为其设置显式路由,例如:
     [Route("/hello/{name}/{id}")]

    但这是您说要隐藏的公共(public)信息。另一种方法是使用通配符路由,例如:
     [Route("/hello/{name*}")]

    匹配任何 /hello/*路线公司 /hello , /hello/foo , /hello/foo/id , /hello/foo/id/and/more/etc .

    但是您的 中填充了什么你好。姓名 属性将是 foo/id您必须在服务中检测和解析。

    另一种方法是在 QueryString 或 POST 表单参数中提供隐藏的 id,您可以在 ServiceStack 中使用它来进一步填充任何请求 DTO,例如使用原始路线:
     [Route("/hello/{name}")]

    将让您使用 /route/foo?id=secret 调用服务如果您的请求 DTO 有 编号 属性将填充 secret .如果您没有(或不想)拥有 id 属性,您仍然可以使用以下方式访问参数:
    base.Request.QueryString["id"];
    base.Request.FormData["id"];

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

    关于servicestack - 将参数插入服务堆栈中的 Web 服务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14841889/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com