wake-up-neo.com

Routenparameter mit Schrägstrich "/" in URL

Ich weiß, dass Sie im route-Attribut einen Platzhalter verwenden können, um / Zuzulassen, z. B. Datumseingabe:

[Route("orders/{*orderdate}")]

Das Problem mit dem Platzhalter gilt nur für den letzten Parameter in der URI. Wie löse ich das Problem, wenn ich die folgende URI haben möchte:

[Route("orders/{orderdate}/customers")]

pdate:

Ich weiß, dass es nur wenige Möglichkeiten gibt, das Problem durch Umgestaltung des Codes zu lösen. Bieten Sie daher keine Lösung an, wie z.

  1. ändere die Routenvorlage in [Route("orders/customers/{orderdate}")]
  2. ändern Sie das Datum in ein anderes Format (z. B. "dd-mm-yyyy")
30
bet

@ bet .. Ich denke, dass genericUriParserOptions nicht mehr für .net 4.5 oder höher gilt.

Auch wie von @ JotaBe vorgeschlagen, müssen Sie die URL-Anforderung möglicherweise korrekt dekodieren. In den meisten Fällen wird %2F Automatisch in einen Schrägstrich '/' Übersetzt. Wenn Sie es also entschlüsseln müssen, müssen Sie zunächst das Zeichen '%' Entschlüsseln. Ihre URL sieht also so aus: www.domain.com/api/orders/23%252F06%252F2015/customers

Beachten Sie, dass die Zeichen '%252F' In das tatsächliche '%2F' Übersetzt werden.

EDIT

Ok hier ist die komplette Lösung (Versucht es und arbeitet für mich):

  1. Angenommen, Sie haben einen API-Endpunkt wie folgt:

    [Route("orders/{date}/customers")]
    public HttpResponseMessage Get(string date)
    {
    }
    
  2. In der web.config müssen Sie requestPathInvalidCharacters auf leer setzen, wodurch asp.net angewiesen wird, alle Anforderungen zuzulassen

    <system.web>
        <httpRuntime targetFramework="4.5" requestPathInvalidCharacters=""/>                
    </system.web>
    <system.webServer>
        <security>
          <requestFiltering allowDoubleEscaping="true" />
        </security>
    </system.webServer>
    
  3. Wenn der Client die Anforderung an die API sendet, müssen Sie sicherstellen, dass das '%' Wie folgt maskiert wird:

    www.domain.com/api/orders/23%252F06%252F2015/customers

  4. Sie müssen dann die Anfrage entschlüsseln

    [Route("orders/{date}/customers")]
    public HttpResponseMessage Get(string date)
    {
            DateTime actualDate = DateTime.Parse(System.Net.WebUtility.UrlDecode(date)); // date is 23/06/2015
    }
    
26
ronnie

Wie im Kommentar von @AlexeiLevenkov vermerkt, ist dies falsch:

Die URL darf keinen Parameter enthalten, der Schrägstriche akzeptiert, da dies ein spezielles Symbol ist, das die einzelnen URL-Fragmente voneinander trennt. Wenn Sie dieses Symbol in Ihre URL einfügen, werden neue Fragmente angezeigt, und ein einzelner Parameter kann nicht mehrere Fragmente enthalten.

Wenn Sie weitere Informationen wünschen, lesen Sie dies , aber dies sind die relevantesten Auszüge:

  • der URL-Pfad endet mit dem ersten ? oder # in der URL. Die Schrägstriche erzeugen also nur Fragmente im Abschnitt des URL-Pfads vor dem Auftreten eines dieser Symbole.
  • Ab Abschnitt 3.4: Die Abfragekomponente wird durch das erste Fragezeichen ("?") Und durch ein Nummernzeichen ("#") oder durch das Ende der URI abgeschlossen.

Daher kann die Abfragezeichenfolge bei Bedarf Schrägstriche (/) Enthalten, die keine Pfadsegmente definieren.

Dies sind einige Lösungen für die Frage:

  • fügen Sie Fragmente für Tag, Monat und Jahr wie folgt hinzu: [Route("orders/{month}/{day}/{year}/customers")] und erstellen Sie dann das Datum auf der Serverseite
  • der Benutzer muss ein anderes Trennzeichen wie einen Bindestrich oder einen Punkt verwenden, um Probleme zu vermeiden. Sie können das Trennzeichen auch an einer Zeichenfolge empfangen und selbst analysieren (oder einen eigenen benutzerdefinierten Binder verwenden, um dieses Format zu unterstützen).
  • verwenden Sie die RL Rewrite-Erweiterung , um die URL zu ändern, bevor sie das Routing-System erreicht, und analysieren Sie sie wie in der vorherigen Lösung erläutert (hierfür ist das Hosten in IIS erforderlich).
  • empfangen Sie es als Abfragezeichenfolge, d. h. in etwa wie folgt: ´? date = 02/03/2015´ (Sie sollten es besser codieren)

ANMERKUNG: Ihre ursprüngliche Frage lautete "Abfragezeichenfolge", und mein Kommentar zur Codierung bezog sich auf die Abfragezeichenfolge, die das letzte Segment einer URL nach dem Fragezeichen ist, falls vorhanden, like &id=27. Ich habe deine Frage so korrigiert, dass sie nicht "Abfragezeichenfolge" enthält, was nicht der richtige Name für das war, was du brauchst

8
JotaBe

Sie können den folgenden URI [Route("orders/{DD:int}/{MM:int}/{YY:int}}/customers")] verwenden und dann einen benutzerdefinierten Modellordner verwenden, um DD/MM/YY und machen Sie daraus ein Datum, das Sie in Ihre Aktionsmethode einbinden können.

Sie können wählen, wie Sie mit Einschränkungen umgehen möchten (verschärfen Sie die Regeln), oder Sie können die Validierung verwenden und 400 zurückgeben, wenn sie nicht übereinstimmen.

Der einfachere Ansatz ist, die Day/Month/Year und füge es in Code zusammen.

Hier ist ein Link für mgang mit Modellbindung .

1
Yishai Galatzer

C # hat eine eigene Methode, die die Regeln von Escape-Sequenzen überspringt. Der Name der Methode lautet ri.UnescapeDataString ( Ihr Parameter für die Abfragezeichenfolge Sie können es verwenden, während Sie den Parameterwert abrufen

0
asif juneja