webentwicklung-frage-antwort-db.com.de

ApiController gibt 404 zurück, wenn ID einen Punkt enthält

Ich habe einen ApiController und möchte E-Mail-Adressen als ID-Parameter für Anfragen verwenden:

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

Ich kann das jedoch nicht zum Laufen bringen (gibt 404 zurück):

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

Folgendes alles funktioniert:

Ich habe relaxedUrlToFileSystemMapping="true" in meiner web.config als detailliert von Phil Haack festgelegt.

Ich würde die vollständige E-Mail-Adresse sehr lieben, um zu arbeiten, aber jedes Mal, wenn ein anderer Charakter auf die Periode folgt, wird eine 404 zurückgesendet. Jede Hilfe wäre sehr dankbar!

Lösung

Aus Mangel an anderen Optionen bin ich in die Richtung gegangen, die Maggie vorgeschlagen hat, und die Antwort von diese Frage verwendet, um eine Umschreibungsregel zu erstellen, die automatisch einen nachfolgenden Schrägstrich anfügt, wenn ich eine E-Mail in der URL benötige.

<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>
51

Würde das Hinzufügen eines nachstehenden Schrägstrichs für Ihr Szenario funktionieren?

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

Überprüfen Sie Ihre IIS -Einstellungen:

Home Directory -> Configuration

Bearbeiten Sie die Anwendungserweiterung .aspx und stellen Sie sicher, dass die Einstellung Verify that file exists deaktiviert ist.

UPDATE

Ich habe gerade mit einem Standard-MVC4-Web-API-Projekt getestet

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

Aktion in ValuesController:

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

Dies war die Antwort:

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

Das hat bei mir funktioniert:

Ich lief auf targetFramework = 4.6.1. Ich habe ein Upgrade auf 4.6.2 durchgeführt und dies in web.config hinzugefügt:

<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>

Der requestPathInvalidCharacters="" soll Dinge wie & etc in URI haben, natürlich in verschlüsselter Form.

1
Nightrain