Warum schlägt HttpWorkerRequest während HttpRuntime.ProcessRequest nach einem .NET 2.0 zu .NET 4.0-Upgrade fehl?

8

Ich aktualisiere unsere Anwendung mit einem internen Webserver von .NET 2.0 auf .NET 4.0.

Ich bearbeite eine Anfrage mit einem Objekt HttpListenerWorkerRequest , das die Klasse HttpWorkerRequest erweitert, und erstellt eine Anfrage, die GetRawUrl() eine URL im Format http://localhost:82/Default.aspx zurückgibt.

In .NET 2.0 funktioniert das Senden an HttpRuntime.ProcessRequest(httpListenerWorkerRequest) ohne Probleme, aber in .NET 4.0 bekomme ich eine Webseite mit dem nichts als dem Text "Bad Request" darauf.

Knacken open HttpRuntime , ich kann sehen, dass Schlechte Anforderungen von ProcessRequestInternal(HttpWorkerRequest wr) , eine private Methode, die versucht, einen HttpContext zu erstellen, geworfen werden.

Ich habe es selbst versucht:

%Vor%

Pre-update (.NET 2.0), es baut gut, post-update (.NET 4.0), ich bekomme eine System.ArgumentException, dass

The relative virtual path 'http:/localhost:82/Default.aspx' is not allowed here , geworfen bei

%Vor%

Was hat sich in .NET geändert, um dies zu verursachen, und was kann ich tun, um es zu umgehen?

BEARBEITEN Ich habe gerade bemerkt, dass dem nicht erlaubten http: ein einfacher Schrägstrich folgt, kein Double, obwohl GetRawUrl () in der Anfrage sicherlich ein Double zurückgibt.

    
johnc 17.04.2013, 23:15
quelle

2 Antworten

6

Ich bin nicht 100% sicher, dass dies die "exakte Antwort" ist, aber sieht mir sehr nahe - und es gibt noch mehr zu schreiben ...

Es scheint ein breaking change einer Sorte in der Klasse VirtualPath zu sein - und es ist begründet, wie sie nach illegal characters suchen. (Außerdem können Sie die 'VirtualPath-Quelle' nach einer .NET 4-Version suchen).

Innerhalb von VirtualPath.Create wird eine Überprüfung für 'ungültige virtuelle Pfadzeichen' aufgerufen.

Es geht zuerst in die Registrierung (" HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ ASP.NET ", " VerificationCompatibility ") - um zu sehen, ob der compatibility -Modus 'illegal ist Zeichen sollten verwendet werden.

  

Darauf basierend - ich vermute (ich habe keine Möglichkeit, das zu überprüfen   gerade jetzt) ​​- das wenn Sie den obigen Registrierungswert (int) auf 1 setzen -    Sie sollten Ihre Methoden mit the old way arbeiten lassen und keine anderen   zusätzlicher Aufwand. Hinweis: Ein IIS- (oder Hostprozess) Neustart ist möglicherweise erforderlich, wie in einem der Links vorgeschlagen

Und dann, basierend auf diesem Registry-Flag, hat es einen dieser beiden ...

verwendet %Vor%

Das scheint Ihre Geschichte ziemlich gut zu beschreiben, da Ihr Pfad mit der Bezeichnung "port" tatsächlich illegal für den neuen Standard ist.

ENDBEARBEITUNG / ERLÄUTERUNG:

(Aktualisierung basierend auf Kommentaren und der Lösung, die es gelöst hat)
Das ist mein Verständnis davon, was im Inneren vor sich geht:

1) Lösung für vor .NET 4.0 war der Schlüssel VerificationCompatibility (siehe oben).

2) Mit .NET 4.0 wird die interne Behandlung und Fixierung von URL-Pfaden robuster gemacht. Und funktioniert in den meisten Fällen gut. Kurz gesagt, Alle Pfade werden fixiert und normalisiert, bevor VirtualPath.Create eingegeben wird - und Ihr http://... wird zu einem erwarteten absoluten Pfad /Default.aspx .

Wenn Sie jedoch HttpWorkerRequest (anstelle von Anfrage / Antwort usw.) angeben, wird raw Url direkt aus worker - übernommen und die Verantwortung für die Bereitstellung der korrekten und normalisierten Pfade liegt bei Ihre Worker-Anfrage . (Dies ist immer noch ein bisschen zweifelhaft, und sieht aus wie ein Bug oder schlechte Handhabung intern).

So reproduzieren Sie das Problem:

%Vor%

Gibt den Fehler The relative virtual path 'http:/localhost:82/Default.aspx' is not allowed here.

Das Update:

%Vor%

Und ein Teil der Forschung zu diesem Thema basiert auf dem Schlüsselwort VerificationCompatibility in der Registry, das der Schlüssel dazu zu sein scheint.

kaufmännisches Und-Zeichen in URL filename = schlechte Anfrage

Konfigurieren Sie IIS, um URL mit Sonderzeichen zu akzeptieren ...

Für 32 vs 64 Unterschied in der Registry

Und hier ist eine ähnliche Sache von Microsoft - aber was scheint ein "Hotfix" für "2.0", d. h. nicht für Sie - aber nur als etwas offizielles in dieser Zeile anhängen.

FIX: Fehlermeldung "HTTP 400 - Ungültige Anforderung" in .NET Framework 1.1 Update: Fehlermeldung, wenn Sie versuchen, eine ASP.NET 2.0-basierte Webseite zu besuchen: "HttpException (0x80004005 ): '/HandlerTest/WebForm1.aspx/a:b' ist kein gültiger virtueller Pfad "
ASP. NET 2.0 x64 - Sie können HTTP 400 Bad Request oder Fehler erhalten, wie in KB 932552 oder 826437 erwähnt

  

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ ASP.NET

     

DWord-Wertname: VerificationCompatibility-Wert: 1

    
NSGaga 22.04.2013, 01:36
quelle
2

Hier ist meine Meinung dazu. Es enthält immer noch einige Rätselraten, aber ich werde einen Test einschließen, den Sie machen können, um diese Hypothese zu beweisen oder zu widerlegen.

Der Stack-Trace zeigt ClientFilePath.get als Ursprung der Ausnahme an. Es sieht so aus:

%Vor%

Erzeugt ein VirtualPath und erlaubt nur absolute Werte. http://localhost:82/Default.aspx ist ein relativer Pfad, da er nicht mit einem Schrägstrich beginnt. In diesem Kontext ist nicht eine URL, weil sie nicht als solche interpretiert wird.

So verweigert VirtualPath.Create diesen Pfad verständlicherweise. Ich weiß nicht, warum .NET 2.0 dies erlaubte, aber .NET 4.0 erfordert einen absoluten Pfad und entsprechend dem Code ist das nicht konfigurierbar.

Ich habe noch nie gesehen, dass HttpRequest.RawUrl eine URL zurückliefert. Nach meiner Erfahrung sollte es einen absoluten Pfad wie /Default.aspx zurückgeben. Wenn Sie den Host und den Port einstellen wollen, müssen Sie andere Möglichkeiten finden, dies zu tun.

Das Problem ist also, nicht http://localhost:82/Default.aspx , sondern /Default.aspx zu verwenden. Würde das für dich funktionieren?

    
usr 22.04.2013 09:37
quelle

Tags und Links