4

我有一個WebApi路由api/{type}({id})/{prop} 我想用它調用它的url,如/api/User(domain\username)/groups - 關鍵點是「\」中的id值。我從客戶端url編碼發送它,即: api/User(domain%5Cusername)/groups。但路線被忽略,我越來越404.ASP.NET 4 WebApi:使用反斜槓的路線

如何將斜線傳遞迴路線的參數?

+0

它沒有反斜槓嗎?我從來沒有在uri細分市場看到多個參數。 – ATerry

+0

@ATerry當然。 Url'api/User(用戶名)/ groups'導致路由。 – Shrike

+0

我還沒有找到解決方案,但我注意到IIS是搞砸了,而不是Asp。它與url重寫模塊有關。當我測試這個時,我從IIS靜態文件處理程序得到404,而不是來自web api的404。另外,如果我查看錯誤中的「請求的URL」,它會解碼反斜槓並將其轉換爲正斜槓。也許嘗試寫一個重寫規則或使用管道或其他非保留字符。 – ATerry

回答

4

由於@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=falsesystem.webServer/security/requestFiltering規則:

<security> 
     <requestFiltering allowDoubleEscaping="true"> 
     </requestFiltering> 
    </security> 

有了這個規則進入了一個MVC /阿比控制器中的值將被編碼(用%)。所以我們必須對它進行解碼:

public virtual DomainResult GetObjectProp(string type, string id, string prop) 
{ 
     id = Uri.UnescapeDataString(id); 
} 
+1

終於讓自己使用同樣的方法工作。我應該補充說,這不是真的IIS有問題,但是Http.sys會執行清理。 IIS能夠拉取未編碼的URL並進行重寫。 – ATerry