2013-02-12 81 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