【发布时间】:2012-10-29 05:02:52
【问题描述】:
我有一个 ApiController,我想使用电子邮件地址作为请求的 ID 参数:
// GET api/employees/email@address.com
public CompactEmployee Get(string id) {
var email = id;
return GetEmployeeByEmail(email);
}
但是,我无法让它工作(返回 404):
http://localhost:1080/api/employees/employee@company.com
以下所有工作:
http://localhost:1080/api/employees/employee@companyhttp://localhost:1080/api/employees/employee@company.http://localhost:1080/api/employees?id=employee@company.com
我在 web.config 中将relaxedUrlToFileSystemMapping="true" 设置为detailed by Phil Haack。
我非常希望完整的电子邮件地址能够正常工作,但只要句号后面跟着任何其他字符,请求就会返回 404。任何帮助将不胜感激!
解决方案
由于缺少其他选项,我已按照 Maggie 建议的方向前进,并使用来自 this question 的答案创建了一个重写规则,以便在我需要在 URL 中发送电子邮件时自动附加尾部斜杠。
<system.webServer>
....
<rewrite>
<rules>
<rule name="Add trailing slash" stopProcessing="true">
<match url="^(api/employees/.*\.[a-z]{2,4})$" />
<action type="Rewrite" url="{R:1}/" />
</rule>
</rules>
</rewrite>
</system.webServer>
【问题讨论】:
-
谢谢@Jonathan-Freeland,这解决了我同样的问题。微软认为这是一个很好的设计,我只能摇头。任何其他值得一提的 Web 框架都可以让您使用正则表达式或 anything 快速轻松地配置静态/动态 URL,而不是假设句点始终意味着静态文件并导致开发人员跳过箍来解决问题这个假设。多么不必要的浪费时间。
-
感谢@Jonathan-Freeland!我处于无法更改客户端但只需要在最后添加斜杠的情况下,您的解决方案对我来说非常有效
标签: asp.net-mvc asp.net-web-api asp.net-mvc-routing