我最初问了以下问题,以获得一些关于如何处理我的Web Api的URL(GET)请求中的特殊字符的问题:
Web Api 2 routing issue with special characters in URL
编码显然是要走的路。但为了让一切工作,我不得不做一个非常讨厌的解决方法。而现在,我正处于我不明白为什么我的解决方法必须首先完成的地步。所以,以下是我的设置:
客户可以通过包含URL中的电子邮件的get请求来调用我的Web Api 2,在iis 8.5上托管。最极端的例子是以下电子邮件:
!是的,该sucker是一个有效的电子邮件,因此API必须支持。 URL模式如下:
... / API /权限/ {电子邮件} / {品牌} /
所以获取请求将是这样的:
!... / API /许可/#$%&放大器;'* + - / = ^ _`{} |~@test.com/economy
正如我对其他问题的明确答案所示,编码此网址显然是必要的。但这给我留下了一些其他问题,例如“不允许双字符转义”,以及一些特定的“404 - 未找到”(路由无法通过网址)。我可以管理iis的以下设置:
<system.web>
...
<httpRuntime requestPathInvalidCharacters=""/>
</system.web>
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true"/>
</security>
...
</system.webServer>
现在我可以用那些讨厌的特殊字符来调用我的方法,一切都很好。但是我又碰了一下。上面指定的电子邮件,#!$%&amp;'* + - / =?^ _`{} |〜@ test.com,导致404 - 未找到。一个实际的404 - 没找到。路由无法处理请求URL:
[Route("{email}/{brand}"]
据我所知,iis解码请求url,将其传递给iis请求管道,然后由web api接收,然后在点击控制器之前通过http消息处理程序运行。在控制器中,我可以清楚地看到网址的电子邮件部分不再编码(假设我使用了一个简单的编码电子邮件。编码的电子邮件“#!$%&amp;'* + - / =?^ _ `{} | ~@test.com “仍然回复404)。我很快发现,路由可能无法处理url路径中的碎片,因为iis将解码后的url传递给web api。所以我必须在递送到网络api之前将网址重新编码在iis中。
通过使用Url ReWrite,我能够解决这个问题。它重新编码了包含电子邮件的URL的特定部分,现在使用特殊字符电子邮件正确处理了路由。预期的方法被击中,我可以解码编码的电子邮件。简而言之,这就是流程:
现在,我们已经设置了LogMessageHandler,它记录传入的请求和传出的响应。当记录器记录request.RequestUri时,很明显该电子邮件是 double 编码。但是当控制器方法被击中时,它只被编码一次!那么..我的问题是,为什么我必须重新编码iis中的URL以便路由正确处理请求,当url已经自动编码(并在点击控制器之前再次解码)?这是我可以配置的吗?我可以以某种方式扩展URL编码的范围,一直到控制器??
此致
弗雷德里克