ASP.NET 4 WebApi:带斜杠的路由

时间:2017-03-21 18:34:41

标签: asp.net asp.net-mvc-4 asp.net-web-api asp.net-web-api-routing

我有一个WebApi-route api/{type}({id})/{prop} 我想用/api/User(domain\username)/groups之类的网址来调用它 - 关键点是id值中的“\”。我从客户端url编码发送它,即: api/User(domain%5Cusername)/groups。但是路线被忽略了,我得到了404。

如何将斜杠传递回路线的参数?

1 个答案:

答案 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);
}