让我说我从服务堆栈示例中定义了Hello World Web服务,但不是只将其称为/ hello / {name},我希望能够将其称为/ hello / {name} / id,我将id定义为一个单独的参数(通过将它存储在refId中,在CustomUserSession中)。
换句话说,我想将身份验证和实际的Web服务调用分成两部分,但我不想在实际的Web服务调用中公开这个id,因为这是私有的,只在我的系统中。我该怎么做呢?我理想的工作流程是:
这几乎就像我想从另一个Web服务中调用Web服务。
如果这似乎是一个误导的问题,我道歉,但我该如何实现这个工作流程呢?
由于
答案 0 :(得分:3)
我建议您查看ServiceStack routing。只有当您的服务与现有路线匹配(或使用pre-defined route)时,才会调用您的服务,这意味着您只有:
[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'ed表单参数中提供隐藏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
您可以在服务中访问:{/ p>
base.Request.Headers["X-id"];