ОбзорКак я могу изменить запрос POST с помощью пользовательского IHttpModule и фильтра HttpRequest?
Я хочу, чтобы иметь возможность изменять параметры запроса и контент 3-участник веб-службы (ArcGIS Server). Это будет использоваться для создания уровня безопасности, который существует между любым клиентским приложением и серверным приложением.
Я думаю, что я нашел решение, но в настоящее время я испытываю определенные трудности при реализации.
Потенциальное решение: Изменить запрос с фильтром пользовательского запроса
Для решения я реализовал пользовательский фильтр запроса свободно на основе sample shown on MSDN. Я «улучшил» код, чтобы я мог искать и заменять необходимый контент с помощью регулярных выражений. Это включает в себя:
- Преобразование содержимого (хранимого в массиве байтов) в строку.
- Поиск строки и выполнение любых необходимых изменений.
- Преобразование измененной строки в массив байтов и запись ее в буфер.
Пример приведен ниже:
public override int Read(byte[] buffer, int offset, int count)
{
int bytesRead = _stream.Read(buffer, offset, count);
string orgContent = Encoding.UTF8.GetString(buffer, offset, bytesRead);
string orgContentDecoded = HttpUtility.UrlDecode(orgContent);
string layersPattern = @"&layers=(show|hide|include|exclude):([0-9]+,?)+";
Regex layersRegex = new Regex(layersPattern, RegexOptions.IgnoreCase);
string[] permittedLayers = new string[] { "0" , "1" };
string replacementLayers = "&layers=show:" + String.Join(",", permittedLayers);
string newContentDecoded = layersRegex.Replace(orgContentDecoded, replacementLayers);
string newContent = newContentDecoded.Replace(",", "%2C").Replace(":", "%3A");
byte[] newBuffer = Encoding.UTF8.GetBytes(newContent);
int newByteCountLength = Encoding.UTF8.GetByteCount(newContent);
Encoding.UTF8.GetBytes(newContent, 0, Encoding.UTF8.GetByteCount(newContent), buffer, 0);
return bytesRead;
}
Это, кажется, работает хорошо до тех пор, как модифицированная длина содержание не отличается от первоначальной длины содержимого. Например, если я заменю 1 на 2, все будет работать. Однако, если я заменил 1 на 10 (тем самым увеличив размер сообщения на 1), тогда я получаю сообщение об ошибке от ArcGIS Server, что формат не поддерживается.
Это принесло две проблемы в мое внимание:
- Текущая реализация не обрабатывает Chunked запросы. То есть, если запрос sie достаточно велик, Read может быть вызван несколько раз для одного запроса. Как следует обрабатывать в этом сценарии?
- В чем причина сообщения об ошибке? Является ли проблема связана с длиной содержимого, отличной от длины потока? Как правильно изменить содержимое, чтобы не изменять его длину?
Любые мысли?