59

我有一个 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@company
  • http://localhost:1080/api/employees/employee@company.
  • http://localhost:1080/api/employees?id=employee@company.com

我已经relaxedUrlToFileSystemMapping="true"在我的 web.config 中设置了 Phil Haack 的详细说明

我非常希望完整的电子邮件地址能够正常工作,但只要句号后面跟着任何其他字符,请求就会返回 404。任何帮助将不胜感激!

解决方案

由于缺乏其他选项,我朝着 Maggie 建议的方向前进,并使用这个问题的答案来创建重写规则,以便在我需要在 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>
4

3 回答 3

84

添加斜杠是否适合您的场景?

http://localhost:33021/api/employees/employee@company.com/
于 2012-11-08T22:33:09.770 回答
2

检查您的 IIS 设置:

Home Directory -> Configuration

编辑.aspx应用程序扩展并确保该设置处于Verify that file exists关闭状态。

更新

我刚刚使用默认的 MVC4 Web API 项目进行了测试

网址:http://localhost:10983/api/values/cool@email.com

行动ValuesController

public string Get(string id)
{
    return id;
}

这是回应:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">cool@email.com</string>
于 2012-11-08T23:54:08.773 回答
1

这对我有用:

我在 targetFramework = 4.6.1 上运行。我已经升级到 4.6.2 并在 web.config 中添加了这个:

<system.web>
        <customErrors mode="Off"/>
        <compilation debug="true" targetFramework="4.6.2"/>
        <!-- This will allow to search for stuff that contains . & etc.-->
        <httpRuntime targetFramework="4.6.2" maxRequestLength="100000" maxUrlLength="2048" relaxedUrlToFileSystemMapping="true" requestPathInvalidCharacters=""/>
  </system.web>

当然,这requestPathInvalidCharacters=""是为了能够在 URI 中以编码形式包含 & 等内容。

于 2018-09-11T23:45:48.043 回答