2014-11-24 65 views
0

我現在使用ServiceStack一段時間了,我對它提供的功能非常滿意。已經實施了它的服務和它的作用就像一個魅力。ServiceStack URI編碼

但是最近我遇到了一個問題,那就是用一個複雜的URL來調用其他服務時必須正確編碼。

的代碼如下:

的請求:

[Route("/instruments/{Names}")] 
internal class Request 
{ 
    public List<string> Names { get; set; } 
} 

而且方法調用:

var request = new Request { Names = list }; 
var c = new JsonServiceClient("http://host:12345/"); 

Response[] response; 
try 
{ 
    response = c.Get<Response[]>(request); 
} 
catch (WebServiceException ex) 
{ 
    HandleWebException(ex, list); 
    yield break; 
} 

而現在的問題是,有時,名稱可以包含一個特殊字符像空間或/。 我想要那些propery編碼。例如,我希望能夠使用以下參數調用遠程服務:「D \ S N」應該被編碼爲「D%5CS%20N」。 所以稱爲URL應該是這個樣子:

http://host:12345/instruments/D%5CS%20N 

而現在的問題是,JsonServiceClient這裏確實不好編碼。 我所說的實際上是:

http://host:12345/instruments/D/S%20N 

跟顯然是錯的。 任何幫助如何解決這個問題是appeciated。

回答

1

你不應該在PATHINFO註冊複雜類型像List<T>,嘗試用一個字符串:

[Route("/instruments/{Name}")] 
public class Request 
{ 
    public string Name { get; set; } 
} 

還是把它拿出來/ PATHINFO,因此它會得到序列作爲查詢字符串的複雜類型:

[Route("/instruments")] 
public class Request 
{ 
    public List<string> Names { get; set; } 
} 
+0

嗨德米斯,感謝您的答案。 – 2014-11-25 13:13:05

+0

嗨德米斯,謝謝你的回答。不幸的是它並沒有改變任何東西。客戶端仍在調用以下URL:http:// host:12345/instruments/D/S%20N。有趣的是,當我將Names參數更改爲查詢參數而不是Path參數時,它可以正常工作:http:// host:12345/instruments?names = D%5CS%20N。不幸的是我不能改變這個界面。 – 2014-11-25 13:22:12

+0

你不能在param中有一個'/',它會像一個單獨的組件那樣對待。你可以改變它來使用通配符,這將吸收所有的路徑組件,即'[Route(「/ instruments/{Name *}」)]' – mythz 2014-11-25 14:37:22

1

我相信ServiceStack可以在這裏得到改進。

如果我使用這樣定義的請求DTO:

[Route("/hello/{Name}/{Message}")] 
public class Hello 
{ 
    public string Name { get; set; } 
    public string Message { get; set; } 
} 

然後客戶端調用是這樣的:

var resp = cli.Get(new Hello { Message = "test", Name = "foo/bar" }); 

將失敗。如果我用反斜槓替換斜線,也會發生同樣的情況。

我已經修補了ServiceStack,修復了這種行爲(也適用於反斜槓),因此Name將被正確編碼爲客戶端和解碼服務器端。德米斯,這是你可能有興趣看看的東西嗎?

順便說一句,這工作良好的開箱即用Java澤西.....