我有一个WebApi-route api/{type}({id})/{prop}
我想用/api/User(domain\username)/groups
之类的网址来调用它 - 关键点是id
值中的“\”。我从客户端url编码发送它,即:
api/User(domain%5Cusername)/groups
。但是路线被忽略了,我得到了404。
如何将斜杠传递回路线的参数?
答案 0 :(得分:5)
正如@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
的通用规则会更有用。
我的想法是抓住一个带有%5C
的网址并重写它以将其恢复。这有点奇怪,但它确实有效。
除了规则,我们需要在allowDoubleEscaping=false
/ system.webServer
/ security
中设置requestFiltering
:
<security>
<requestFiltering allowDoubleEscaping="true">
</requestFiltering>
</security>
使用此规则,将对Mvc / Api控制器中的值进行编码(使用%)。所以我们必须解码它:
public virtual DomainResult GetObjectProp(string type, string id, string prop)
{
id = Uri.UnescapeDataString(id);
}