Wie erlaube ich URL-codierte Pfadsegmente in Azure?

9

Ich habe eine ASP.NET 6 MVC-Anwendung in Azure ausgeführt. Ich habe einen Controller mit einer Aktion wie

%Vor%

Ich nenne es dann wie

%Vor%

Diese Anwendung funktioniert gut, wenn Sie mit Kestrel selbst hosten, aber sobald ich Azure bereitstellen, erhalte ich 500 Fehler. Ich habe so viel wie möglich debugged und nach viel Googeln und stochern scheint es, dass IIS versucht, URL decode die Anfrage vor dem Weiterleiten an ASP.NET zu behandeln. Das Problem ist natürlich, dass ich selbst dann IIS überzeugen kann, die Anfrage mit

zu akzeptieren %Vor%

Es dekodiert immer noch die URL und übergibt die decodierte URL an ASP.NET, die keine passende Route findet.

Was kann ich tun, um IIS zu sagen, dass er aufhören soll, hier hilfreich zu sein, und einfach die URL weitergibt, die er erhält, ohne irgendeine Art von Vorvalidierung oder Neuschreiben auf dem Weg zu machen? Hinweis: Dies ist eine Azure Web App, sodass ich keinen direkten Zugriff auf IIS-Einstellungen habe.

    
Micah Zoltu 12.05.2016, 06:32
quelle

1 Antwort

2

Sie könnten einfach Ihre Routendefinition aktualisieren, damit sie mit einem decodierten Bild-URL-Parameter übereinstimmt.

Gemäß der Dokumentation , wenn Sie Routenvorlagen definieren :

  

Sie können das Zeichen * als Präfix für einen Routenwertnamen zum Binden verwenden   zum Rest der URI. Zum Beispiel würde blog / {* slug} mit jedem URI übereinstimmen   das begann mit / blog / und hatte einen Wert, der ihm folgte (was   dem Slugroute-Wert zugewiesen werden).

Sie könnten also eine Aktion erstellen, die der Route [Route("{*image_url}")] :

entspricht %Vor%

Das einzige Problem, das ich gesehen habe, ist, dass der Protokollteil als http:/ mit einem einzigen / entschlüsselt wird. Sie haben ein paar Optionen:

  • Sie könnten es manuell in der Steuerung reparieren. Noch besser, Sie könnten einen Modellbinder und eine Parameterkonvention erstellen, um dies automatisch zu tun:

    %Vor%
  • Ein besserer Ansatz könnte sein, Ihre API zu aktualisieren, damit Sie nicht einmal den Protokollteil im Image-Schlüssel verwenden. Dadurch können Sie der vollständigen Image-URL das richtige Protokoll hinzufügen, wenn Sie es rendern müssen, je nachdem, ob http oder https benötigt werden (selbst der Host könnte in den URLs weggelassen werden). Sie müssten sich nicht einmal darum sorgen, dass URL den Bildpfad auf Ihrer Client-Seite kodiert, Sie könnten ihn einfach wie http://localhost:39216/api/repocreator.zoltu.io/images/Zoltu-Logo-Full-Size.png aufrufen.

IMHO Ich würde den zweiten Ansatz bevorzugen. Wenn Sie wirklich die vollständige URL benötigen, die in der Route codiert ist, dann haben Sie zumindest eine Möglichkeit, sie auf eine saubere Weise außerhalb des Controllers zu implementieren.

Hinweis : Wenn Sie den Protokollteil in der Image-URL beibehalten möchten, sieht es so aus, als ob die Middleware für statische Dateien sie nicht mag. Daher muss sie nach MVC in Startup.configure hinzugefügt werden es wird Fehler werfen.

    
Daniel J.G. 17.05.2016 12:27
quelle