web-dev-qa-db-ja.com

IDにピリオドが含まれている場合、ApiControllerは404を返します

ApiControllerがあり、リクエストのIDパラメータとしてメールアドレスを使用したい:

// GET api/employees/[email protected]
public CompactEmployee Get(string id) {
   var email = id;
   return GetEmployeeByEmail(email);
}

ただし、これを機能させることはできません(戻り値404):

http://localhost:1080/api/employees/[email protected]

次のすべての作業:

  • http://localhost:1080/api/employees/employee@company
  • http://localhost:1080/api/employees/employee@company.
  • http://localhost:1080/api/[email protected]

私はweb.configでrelaxedUrlToFileSystemMapping="true"Phil Haackにより詳細 として設定しました。

私は完全なメールアドレスが機能することを非常に気に入っていますが、ピリオドの後に他の文字が続く場合は常に、リクエストは404を返します。どんな助けでも大歓迎です!

解決

他のオプションがないため、マギーが提案した方向に向かい、 この質問 からの回答を使用して、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>
56

末尾のスラッシュを追加すると、シナリオに役立ちますか?

http://localhost:33021/api/employees/[email protected]/
76
Maggie Ying

IIS設定を確認してください:

Home Directory -> Configuration

.aspxアプリケーション拡張および設定Verify that file existsはオフです。

[〜#〜]更新[〜#〜]

デフォルトのMVC4 Web APIプロジェクトでテストしました

URL:http://localhost:10983/api/values/[email protected]

ValuesControllerでのアクション:

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

これは応答でした:

<string xmlns="http://schemas.Microsoft.com/2003/10/Serialization/">[email protected]</string>
2
Mightymuke

これは私のために働いたものです:

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などに&などを含めることができるようにすることです。

1
Nightrain