MFC CHttpServerベースのWebサーバーをASP.Netに変換するときにQueryStringセマンティクスを保持するにはどうすればよいですか?

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

  •  22-07-2019
  •  | 
  •  

質問

従来のMFC CHttpServerベースのWebサーバーには、次のようなマップを解析するコマンドがあります。

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)

これは、 http://host/path/dllname.dll?MyPage でアクセス可能なページを定義し、 intParam1 intParam2 intParam3 intParam4 strParam5 strParam6 strParam7 、および intParam8

呼び出し元のアプリケーションは、次のような名前付きの方法でパラメーターを指定してページを呼び出すことができます。

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

ただし、MFCコマンド解析マップの動作方法は、マップで定義された順序で提供されている限り、名前のないパラメーターで呼び出すこともできます。

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

この古いコードを ASP.Net ページに置き換えたいのですが、名前付きと名前なしの両方のスタイルのパラメーター受け渡しを使用してページを呼び出す、変更されない既存の呼び出しアプリケーションがあります。

必要なURLの書き換えを簡単に管理して、ASP.Netページが上記のURLに応答できるようにし、 path / dllname.dll を置き換えますか? .aspxページまたは.ashxハンドラーへのパスを持つMyPage部分。

古いMFCパラメーターパーサーと同等の方法で名前のないパラメーターを処理しようとすると、問題が発生します。 Request.QueryStringは、名前のないすべてのパラメーターを null で名前が付けられているものとして扱い、 Request.QueryString [null] は値のコンマ区切りリストを返します。これはかなり機能しますが、パラメーターの1つに実際にコンマが含まれている場合、余分なコンマがエスケープされず、コンマで文字列を分割するとパラメーターが多くなりすぎるため、このエンコードはバラバラになります。

従来のASPでは、 Request.QueryString(...)は同じ名前のすべてのパラメーターのコレクションを返したと思います。私が見つけることができるASP.Netに相当するものはないようです。

二次的な問題として、MFCコマンド解析マップには、名前付きパラメーターと名前なしパラメーターの混合を処理するためのかなり複雑なロジックがありました。問題のページの呼び出し元は、このように使用方法を混合することはありませんが、完全性のためにロジックを複製することに興味があります。 MFCの動作が本質的に次のことであることを誰でも確認できますか?

  • セパレーターとして& を使用して、URLのすべてのパラメーターを左から右に処理します。
    • 名前が付けられている(等号を持っている)場合、その位置に関係なく、対応する名前を持つパラメーターに値を適用します。そのパラメーターに既に値が割り当てられている場合、エラー。
    • 名前が付けられていない場合、コマンド解析マップのn番目の位置にあるパラメーターに値を適用します。nは、既に処理されている名前のないパラメーターの数に1を加えたものです。そのパラメーターに既に値が割り当てられている場合、エラー
  • コマンド解析マップのデフォルト値を、上記で割り当てられていないパラメーターに適用します
  • コマンド解析マップのパラメーターに値が割り当てられていない場合、エラー。

もう1つの興味深い注意点として、 Request.QueryString.ToString()はURLの元のパラメーターをほぼ再構成するように見えますが、同じ名前のパラメーターは常に一緒に移動します。ここで心配している名前のないパラメーター。

役に立ちましたか?

解決 2

Request.QueryString には GetValues()メソッドがあることがわかりました。これにより、文字列の配列が返され、値の1つにコンマが埋め込まれる問題が解決されます。 Request.QueryString [null] の結果を分割するよりも使いやすくなります。

これを使用して、名前付きパラメーターと名前なしパラメーターの両方を処理するURLパラメーターのMFCのようなマッピングを実装するための作業がまだあります。

他のヒント

問題を解決できるかどうかはわかりませんが、Request.PathInfoを使用してみてください。これにより、ページの後に入力されたすべてのものが得られ、正規表現などを使用して手動で解析できます。

たとえば、URLがある場合:

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

Request.PathInfoプロパティは以下を返します:

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

これを処理して一連の値を処理することも、名前付きパラメーターと名前なしパラメーターの両方を持っているため問題になる可能性がありますが、これは正規表現や文字列の分割を使用して達成できるはずです

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top