Wie kann ich die Abfrage-Zeichenfolge-Semantik beibehalten, wenn ein MFC-CHttpServer basierten Web-Server zu ASP.Net konvertieren?

StackOverflow https://stackoverflow.com/questions/1442302

  •  22-07-2019
  •  | 
  •  

Frage

In einem Legacy-MFC CHttpServer basierten Web-Server, haben wir einen Befehl Parsing Karte etwas wie folgt aus:

BEGIN_PARSE_MAP(MyHttpServer, CHttpServer)
    ON_PARSE_COMMAND(MyPage, MyHttpServer, ITS_I4 ITS_I4 ITS_I4 ITS_I4 ITS_PSTR ITS_PSTR ITS_PSTR ITS_I4)
    ON_PARSE_COMMAND_PARAMS("intParam1=11 intParam2=12 intParam3=13 intParam4=14 strParam5=s5 strParam6=s6 strParam7=s7 intParam8=18")
END_PARSE_MAP(MyHttpServer)

Dies definiert eine Seite zugänglich http://host/path/dllname.dll?MyPage die intParam1, intParam2, intParam3, intParam4, strParam5, strParam6, strParam7 und intParam8 bis 8 Parameter genannt akzeptiert werden.

Die rufenden Anwendungen, die die Seite mit den Parametern in einer benannten Art und Weise wie folgt aufrufen können:

http://host/path/dllname.dll?MyPage?intParam4=32&strParam7=somestring

Aber die Art und Weise MFC Befehl Parsen Karten arbeiten, sie kann es auch so lange mit unbenannte Parametern nennen, wie sie in der Reihenfolge von der Karte definiert vorgesehen sind:

http://host/path/dllname.dll?MyPage?21&22&23&24&string5&string6&string7&28

Ich mag diesen alten Code mit einer ASP.Net Seite ersetzen, aber wir haben bestehende Aufruf von Anwendungen, die geändert werden nicht, dass die Seite mit beiden Arten von Parameterübergabe aufrufe, mit dem Namen und unbenannte .

Ich kann leicht die notwendige URL verwalten Umschreiben einer ASP.Net Seite, damit die URL reagieren, wie oben angegeben, ersetzt das Pfad / dllname.dll ? MyPage Teil mit dem Pfad zu einem ASPX-Seite oder .ashx Handler.

Das Problem kommt, wenn versucht, die unbenannte Parameter in äquivalenter Weise mit dem alten MFC Parameterparser zu handhaben. Request.QueryString behandelt alle unbenannte Parameter wie mit null genannt wird und Request.QueryString[null] gibt Liste der Werte eine durch Komma getrennt. Das ist ziemlich nah an praktikabel, sollte aber einer der Parameter enthält tatsächlich ein Komma, diese Codierung auseinander fällt, weil das zusätzliche Komma wird, mit zu vielen Parametern nicht entkommen und auf den Kommas die Zeichenfolge aufteilen enden.

In der klassischen ASP, glaube ich Request.QueryString(...) eine Sammlung aller Parameter zurückgegeben, die identisch benannt wurden. Es scheint kein Äquivalent zu der in ASP.Net zu sein, dass ich finden kann.

Als zweitrangig, der Befehl Parsing Karte MFC hatte einige ziemlich gewundenen Logik für mit einer Mischung aus benannten und unbenannten Parameter handelt. Obwohl die Anrufer der betreffenden Seite nicht ihre Nutzung auf diese Weise das Mischen wird, bin ich in vielleicht daran interessiert, die Logik für die Vollständigkeit halber duplizieren. Kann jemand bestätigen, dass MFC-Verhalten war im Wesentlichen die folgenden?

  • Prozess alle Parameter in der URL von links nach rechts, mit & als Trennzeichen.
    • Wenn genannt (hat ein Gleichheitszeichen), wenden Sie den Wert an den Parameter mit dem entsprechenden Namen, unabhängig von seiner Position. Wenn dieser Parameter bereits ein Wert zugewiesen, Fehler.
    • Falls unnamed, gelten den Wert auf dem Parameter bei der n-ten Position in dem Befehls Parsen Karte, wobei n die Anzahl der bereits verarbeiteten unnamed Parameter plus 1. Wenn diese Parameter bereits ein Wert zugewiesen wurde, Fehler.
  • Anwenden Standardwerte Befehl Parsen Karte auf alle Parameter über nicht zugewiesen
  • Wenn alle Parameter von der Kommando Karte haben Parsen keinen Wert, Fehler zugewiesen werden.

Ein weiterer interessanter Hinweis, scheint es, dass Request.QueryString.ToString() wird fast die ursprünglichen Parameter auf die URL Rekonstitution, aber es bewegt sich immer die Parameter mit identischen Namen, zusammen zu sein, einschließlich der unbenannte Parameter ich betroffen bin mit hier.

War es hilfreich?

Lösung 2

Ich fand, dass Request.QueryString eine GetValues() Methode hat. Dies gibt ein Array von Zeichenketten und löst das Problem der Komma innerhalb einer der Werte eingebettet ist. Es wird sogar einfacher als zu verwenden, die Ergebnisse Request.QueryString[null] aufzuspalten.

Ich habe noch ein bisschen Arbeit, dies zu verwenden, um eine MFC-ähnliche Abbildung von URL-Parametern zu implementieren, die die beiden benannten und unbenannten Parameter behandelt.

Andere Tipps

Nicht sicher, ob Ihr Problem löst, aber man könnte versuchen Request.PathInfo verwenden. Dies wird Ihnen alles, was nach der Seite eingegeben, die Sie dann manuell so etwas wie eine Regex analysieren könnte.

Zum Beispiel, wenn Sie die URL haben:

http://host/path/dllname.dll?MyPage?21&22&23&24&string5&string6&string7&28

Die Request.PathInfo Eigenschaft zurückkehren würde:

?MyPage?21&22&23&24&string5&string6&string7&28

Die Verarbeitung dieses in eine Reihe von Werten, die Sie mit auch arbeiten können, könnte problematisch sein, wie Sie beiden Namen und unbenannten Parameter haben, aber erreichbaren reguläre Ausdrücke verwenden sollte und / oder die Zeichenfolge aufgeteilt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top