2017-05-17 1 views
9

ich C# .NET WebAPI mit einem API-Proxy zu erstellen, hier ist einfach Code, die ich habe, die für die meisten Anrufe funktioniert gut:WebAPI Proxy 404 für URLs mit ungültigen Zeichen werfen

[HttpGet] 
[Route("api/proxy/{*.}")] 
public async Task<HttpResponseMessage> Get() 
{ 
    // some route here... 
} 

Aber als ich habe eine URL mit speziellen Zeichen, wie: (% 3F) oder/(% 2F) schlägt es mit 404 fehl. Wenn ich die speziellen Zeichen entferne, funktioniert es.

http://localhost:3000/api/proxy/viewing/v1/items/urn%3Aadsk.viewing%3Afs.file%3AdXJuOmVUE_dmVyc2lvbj0x%2Foutput%2Fd4b6ef1c-8d219bd84c9d%2F0.pf?domain=http%3A%2F%2Flocalhost%3A3000 

und versuchte, ein paar Vorschläge auf web.config, aber nichts:

<system.web> 
    <httpRuntime targetFramework="4.6" requestPathInvalidCharacters=""/> 
    <pages validateRequest="false" /> 
</system.web> 

Alle anderen WebAPI Endpunkte mit einem Global.asax wie folgt arbeiten:

public class Global : System.Web.HttpApplication 
{ 
    protected void Application_Start(object sender, EventArgs e) 
    { 
    GlobalConfiguration.Configure(Config.WebApiConfig.Register); 
    } 
} 

Und die Config.WebApiConfig:

public class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
    config.MapHttpAttributeRoutes(); 
    } 
} 
+0

Wurde diese Frage nicht schon einmal gestellt und beantwortet? https://Stackoverflow.com/a/14368595/495455 und die offizielle Quelle ist Scott Hanselmans Blog [Experimente in Verrücktheit: Erlauben von Prozenten, Winkeln und anderen ungezogenen Dingen in der URL der ASP.NET/IIS Anfrage] (http: //www.hanselman.com/blog/ExperimenteInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx) –

+0

Sie könnten versuchen, die schnelle und schmutzige Route: System.Uri.EscapeDataString (Zeichenfolge Daten) ..... um eine Zeichenfolge ohne diese Sonderzeichen zurückgeben? (auch neugierig, ist dies für eine Schmiede-Projekt?) – BKSpurgeon

Antwort

5

Nach der Antwort MVC WEB API routing fails when url contains encoded ampersand Sie müssen Zeichen entfernen, die Sie von requestPathInvalidCharacters Eigenschaft httpruntime gültig betrachten:

<httpruntime requestvalidationmode="2.0"> 
      requestPathInvalidCharacters="*,:,&amp;,\" 
      relaxedUrlToFileSystemMapping="true" /> 

Aber es ist viel sicherer, diese Parameter als Query-String zu übergeben.

EDIT:

Ich habe url getestet bilden Ihre Frage http://localhost:3000/proxy/target/v1/urn%3Aparam%2Foutpu?domain=http%3A%2F%2Flocalhost%3A3000 und es funktioniert durch einfaches % Charakter. Sie müssen also die erlaubten Zeichen dort in der requestPathInvalidCharacters Eigenschaft auflisten, zB: %,&amp;,*,\. Meine aktuelle Konfiguration ist:

<httpRuntime targetFramework="4.6.1" requestPathInvalidCharacters="%" /> 

EDIT 2:

ich etwas mehr Forschung gemacht haben, und fand eine Antwort auf ASP.net MVC4 WebApi route with file-name in it. Eine einfache Lösung ist das Hinzufügen der runAllManagedModulesForAllRequests Eigenschaft zum Modulabschnitt in der Webkonfiguration. Wenn Sie die akzeptierte Antwort überprüfen, können Sie versuchen, die Lösung zu optimieren, um die Auswirkungen der Ausführung aller verwalteten Module zu verringern.

Abschließend müssen Sie die folgenden Abschnitte ändern.

<system.web> 
    <httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,\,?"/> 
</system.web> 

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    ... 
    </modules> 
</system.webServer> 
+0

Ich habe versucht, aber die ungültige Zeichen akzeptiert nicht auf die Datei, VS beschwert sich mit ungültigen Zeichen –

+0

@AugustoGoncalves, ich habe meine Antwort aktualisiert, es funktioniert, indem einfach '% 'to' requestPathInvalidCharacters' Eigenschaft. –

+0

dies funktioniert für%, aber immer noch scheitern. (Punkt). Wenn ich es zu requestPathInvalidCharacters hinzufüge, wirft die ganze App "Eine potentiell gefährliche Anfrage. Der Pfad wurde vom Client (.) Gefunden." (und vielen Dank für Ihre Hilfe) –

1

testen 2 Änderungen in web.config: Ich habe nur : vom Standardwert von requestPathInvalidCharacters, die bereits dekodiert zu und hat nichts zu mit % Zeichen in verschlüsselter URL URL gilt entfernt.

<system.web> 
    <httpRuntime targetFramework="4.6" requestPathInvalidCharacters=""/> 
</system.web> 
... 
<system.webServer> 
<handlers> 
    ... 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="*" type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0"/> 
</handlers> 

Hinweis: setze ich eine leere Liste in requestPathInvalidCharacters und den Pfad-Filter in der Prozedur ändern "*".

Verwandte Themen