На устаревшем веб-сервере на основе MFC CHttpServer у нас есть карта синтаксического анализа команд, что-то вроде этого:
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, которая принимает до 8 параметров с именами 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? Часть MyPage с путем к странице .aspx или обработчику .ashx.
Проблема возникает при попытке обработки безымянных параметров аналогично старому синтаксическому анализатору параметров MFC. Request.QueryString рассматривает все безымянные параметры как имена с null, а Request.QueryString[null] возвращает список значений, разделенных запятыми. Это довольно близко к работоспособному, но если один из параметров действительно содержит запятую, эта кодировка разваливается, потому что лишняя запятая не экранируется, и разделение строки на запятые приведет к слишком большому количеству параметров.
Я полагаю, что в классическом ASP Request.QueryString(...) возвращал набор всех параметров с одинаковыми именами. Кажется, в ASP.Net нет аналога, который я могу найти.
В качестве второстепенной проблемы карта синтаксического анализа команд MFC имела довольно запутанную логику для работы со смесью именованных и неименованных параметров. Хотя абоненты рассматриваемой страницы не будут смешивать свое использование таким образом, я заинтересован, возможно, в дублировании логики для полноты картины. Может ли кто-нибудь подтвердить, что поведение MFC было по существу следующим?
- Process all parameters in the URL from left to right, using & as separator.
- If named (has an equal sign), apply the value to the parameter with the corresponding name, regardless of its position. If that parameter already assigned a value, error.
- Если безымянный, примените значение к параметру на n-й позиции в карте синтаксического анализа команд, где n — количество уже обработанных безымянных параметров плюс 1. Если этому параметру уже было присвоено значение, ошибка.
- Применить значения по умолчанию из карты синтаксического анализа команд к любым параметрам, не назначенным выше.
- Если каким-либо параметрам из карты синтаксического анализа команды не присвоено значение, ошибка.
Еще одно интересное замечание: похоже, что Request.QueryString.ToString() почти восстановит исходные параметры в URL-адресе, но всегда перемещает параметры с одинаковыми именами, чтобы они были вместе, включая безымянные параметры, которые меня здесь интересуют.