2013-01-20 139 views
2

我在ASP.NET Web API路由中遇到問題。具體而言,我想傳遞一個字符串參數,該參數爲空或在Uri中包含斜線。但不幸的是,這打破了路由。傳遞字符串作爲包含斜線的uri參數或爲空

我已經有一個合適的路線設置,如果我有一個正常的字符串,如「fubar」,這是匹配很好。我試圖傳遞字符串url編碼,但這不起作用。顯然問題在於某些http sys層已經解碼了字符串,意味着不是"fu%2fbar"到達,而是"fo/bar" - 這導致另一個路由。

此外,當我傳遞一個空字符串的URI是"api//...",這兩個/合併和段被扔掉。

解決內部/問題的一種方法是對Uri進行雙重編碼並在我的方法中對其進行解碼。但這似乎是一個非常糟糕的選擇,所以我正在尋找其他方法來解決這個問題。

+0

將它作爲請求主體接受的參數是否更有意義? –

+0

當我有一個字符串作爲資源的主要標識符時,這樣做是沒有意義的。還有一個可選的過濾器查詢字符串不應該在主體中。 – user1908061

回答

1

對於斜線,你可以準備特別的路線

  "{controller}/{action}/{param1}/{param2}/{param3}" 
      "{controller}/{action}/{param1}/{param2}" 
      "{controller}/{action}/{param1}" 


    public ActionResult Index(string param1, string param2, string param3) 
    { 
     string param = string.Concat(param1, param2, param3); 

這樣,傅和酒吧兩個參數。

對於空字符串沒有任何解決方案。我會通過空間char或別的東西,這意味着「空」,但不是取代它在客戶端應用程序

+0

對不起,如果我讓自己不清楚,但我想傳遞包含斜槓的_one_字符串參數,而不是兩個參數。這個案例對你的建議沒有幫助。我不知道客戶端會發送什麼字符串,所以我應該持有無限量字符串的方法嗎?另外,如果他發送「?」,這也會破壞路由。 – user1908061

+0

當然。我只是建議你一個快速的解決方案。如果你需要管理所有的url特殊字符,只需要url編碼,爲什麼它是一個不好的解決方案,它是爲你的特殊問題而制定的。否則,編寫你自己的路由模塊 –

+0

就像我說的,簡單的URL編碼不起作用。它在路由之前被解碼,所以編碼毫無意義。一個選項會在客戶端對我的字符串進行雙重編碼,然後再次在函數內對其進行解碼,但這似乎是一種非常糟糕的方式。必須有更好的東西。 – user1908061

0

我建議之一:

  1. 更改請求類型是POST,並把串入請求的主體

  2. 或添加一個攔截器(DelegatingHandler),它將獲取請求並重寫url中的參數,例如通過替換無效字符

相關問題