2013-02-12 80 views
2

可以说,我已经定义了的Hello World Web服务,从服务栈的例子,但不是只调用它作为/你好/ {名称},我希望能够到将其称为/ hello/{name}/id,其中我将id定义为一个单独的参数(通过将其存储在refId中,位于CustomUserSession中)。插入参数在服务协议栈的Web服务调用

换句话说,我想将认证和实际的Web服务调用分成两部分,但我不想在实际的Web服务调用中公开此ID,因为这是私有的,只在我的系统中。我会如何去做这件事?我理想中的工作流程是:

  • 客户端调用Web服务:/你好/ {name}的
  • 认证情况。由于该认证的一部分,我得到这个秘密的id保持
  • 我现在调用Web服务作为/你好/ {名称}/ID

这是几乎一样,如果我想打电话从内部Web服务另一个Web服务。

我很抱歉,如果这看起来像一个误导的问题,但我该如何去实现这个工作流程?

感谢

+0

比/你好(名称)将如何应对是/你好/ {名}/ID不同? – 2013-02-12 21:27:21

回答

3

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

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

它不会匹配/hello/{name}/{id}和服务不会被调用。为了配合这条路线,你可以有一个明确的路线吧,e.g:

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

但是,这是你说你想隐藏的公共信息。另一种方法是使用通配符路由,例如:

​​

它匹配任何/hello/* route inc。 /hello,/hello/foo,/hello/foo/id,/hello/foo/id/and/more/etc

但是,您的填写的内容您好。姓名属性将为foo/id,您必须检测并解析您的服务。

另一种方法是在一个查询字符串或POST'ed形式参数,其可以在使用ServiceStack以进一步填充任何请求DTO,例如以供应隐藏标识使用原来的路线:

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

会让你拨打服务与/route/foo?id=secret这如果您的请求DTO有一个ID属性将与secret填充。如果你没有(或希望)有一个id属性,你仍然可以访问帕拉姆:

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

但既然你希望这是隐藏的,你应该避免将它这是网址每个人都可以看到(包括Web代理,http日志和其他中间件)。一个更好的隐藏参数的地方是将它作为自定义HTTP头传递,G:X-id: secret,你可以在你的服务,访问:

base.Request.Headers["X-id"]; 
+0

这就像一个魅力。感谢您的帮助! – Suraj 2013-02-13 13:19:28