[英]Route parameter with slash “/” in URL
我知道你可以在路由屬性中應用通配符來允許/
例如日期輸入,例如:
[Route("orders/{*orderdate}")]
通配符的問題僅適用於URI中的最后一個參數。 如果要擁有以下URI,如何解決問題:
[Route("orders/{orderdate}/customers")]
更新:
我知道通過重構代碼來解決問題的選擇很少,所以請不要提供類似的解決方案:
[Route("orders/customers/{orderdate}")]
"dd-mm-yyyy"
) @bet ..我認為genericUriParserOptions
不再適用於.net 4.5或更高版本..
另外,正如@JotaBe所建議的那樣 ,您可能需要正確解碼網址請求。 在大多數情況下, %2F
將自動轉換為斜杠'/'
。 因此,如果你需要逃避它,你需要首先解碼'%'
字符..所以你的URL:看起來像: www.domain.com/api/orders/23%252F06%252F2015/customers
請注意,字符'%252F'
將轉換為實際'%2F'
編輯
好的,這是完整的解決方案(試過它並為我工作):
假設你有一個像這樣的API端點:
[Route("orders/{date}/customers")] public HttpResponseMessage Get(string date) { }
在web.config中,您需要將requestPathInvalidCharacters
設置為empty,告訴asp.net允許所有請求
<system.web> <httpRuntime targetFramework="4.5" requestPathInvalidCharacters=""/> </system.web> <system.webServer> <security> <requestFiltering allowDoubleEscaping="true" /> </security> </system.webServer>
當客戶端向API發送請求時,您需要確保像這樣轉義'%'
:
www.domain.com/api/orders/23%252F06%252F2015/customers
然后,您需要解碼請求
[Route("orders/{date}/customers")] public HttpResponseMessage Get(string date) { DateTime actualDate = DateTime.Parse(System.Net.WebUtility.UrlDecode(date)); // date is 23/06/2015 }
如@AlexeiLevenkov的評論所述,這是錯誤的:
您不能在URL中有一個接受正斜杠的參數,因為這是一個分隔每個URL片段的特殊符號。 因此,只要在URL中包含此符號,就會有新的片段,並且單個參數不能包含多個片段。
如果您想了解更多詳情,請閱讀本文 ,但這些是最相關的摘錄:
?
或#
在網址中找到。 因此,斜杠僅在出現之前的URL路徑部分或其中一個符號中創建片段。 因此,查詢字符串可以包含正斜杠, /
,如果需要的話,他們不會在所有定義路徑段。
這些是問題的一些解決方案:
[Route("orders/{month}/{day}/{year}/customers")]
然后在服務器端創建日期 注意:您的原始問題是“查詢字符串”,而我對編碼的評論是指查詢字符串,它是問號后面的URL的最后一段(如果存在), like &id=27
。 我更正了你的問題,所以它沒有提到“查詢字符串”,這不是你需要的正確名稱
您可以使用以下URI [Route("orders/{DD:int}/{MM:int}/{YY:int}}/customers")]
然后使用自定義模型綁定器來獲取DD/MM/YY
和將它們轉換為您可以在動作方法中綁定的日期。
您可以選擇如何處理約束(更嚴格地使用正則表達式)或使用驗證並返回400(如果不匹配)。
更簡單的方法是采用Day/Month/Year
並將其放在代碼中。
這是一個處理模型綁定的鏈接。
C#有自己的方法,它跳過轉義序列的規則,方法的名稱是Uri.UnescapeDataString( 你的查詢字符串參數 )你可以在獲取參數值時使用它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.