我有一個WebApi路由api/{type}({id})/{prop}
我想用它調用它的url,如/api/User(domain\username)/groups
- 關鍵點是「\」中的id
值。我從客戶端url編碼發送它,即: api/User(domain%5Cusername)/groups
。但路線被忽略,我越來越404.ASP.NET 4 WebApi:使用反斜槓的路線
如何將斜線傳遞迴路線的參數?
我有一個WebApi路由api/{type}({id})/{prop}
我想用它調用它的url,如/api/User(domain\username)/groups
- 關鍵點是「\」中的id
值。我從客戶端url編碼發送它,即: api/User(domain%5Cusername)/groups
。但路線被忽略,我越來越404.ASP.NET 4 WebApi:使用反斜槓的路線
如何將斜線傳遞迴路線的參數?
由於@ATerry在評論中提出,該問題不在ASP.NET中,而在HTTP.SYS + IIS中。甚至在進入IIS之前,反斜線被HTTP.SYS替換爲正斜槓。
我們可以在UrlRewrite IIS模塊的幫助下工作,因爲它可以訪問原始(未解碼)的url。
對於我的例子,我想出了以下規則。
<rule name="allow backslash" stopProcessing="true">
<match url="api/(.*)\((.*)\)(.*)" />
<action type="Rewrite" url="api/{R:1}({C:1}{C:2}{C:3}){R:3}" logRewrittenUrl="true" />
<conditions>
<add input="{UNENCODED_URL}" pattern="\((.*)(%5C)(.*)\)" />
</conditions>
</rule>
這並不理想,因爲它非常具體。有一個只處理%5C
的通用規則會更有用。
這個想法是趕上一個url與%5C
並重寫它把它放回去。這有點奇怪,但它的工作原理。
此外,我們需要設置allowDoubleEscaping=false
在system.webServer
/security
/requestFiltering
規則:
<security>
<requestFiltering allowDoubleEscaping="true">
</requestFiltering>
</security>
有了這個規則進入了一個MVC /阿比控制器中的值將被編碼(用%)。所以我們必須對它進行解碼:
public virtual DomainResult GetObjectProp(string type, string id, string prop)
{
id = Uri.UnescapeDataString(id);
}
終於讓自己使用同樣的方法工作。我應該補充說,這不是真的IIS有問題,但是Http.sys會執行清理。 IIS能夠拉取未編碼的URL並進行重寫。 – ATerry
它沒有反斜槓嗎?我從來沒有在uri細分市場看到多個參數。 – ATerry
@ATerry當然。 Url'api/User(用戶名)/ groups'導致路由。 – Shrike
我還沒有找到解決方案,但我注意到IIS是搞砸了,而不是Asp。它與url重寫模塊有關。當我測試這個時,我從IIS靜態文件處理程序得到404,而不是來自web api的404。另外,如果我查看錯誤中的「請求的URL」,它會解碼反斜槓並將其轉換爲正斜槓。也許嘗試寫一個重寫規則或使用管道或其他非保留字符。 – ATerry