1: public void ProcessRequest (HttpContext context) {
2:
3: HttpRequest request = context.Request;
4:
5: // Читаем параметры: имя ключа в конфиге(содержит список файлов для объединения), тип конетнат и версию конента.
6: //Все эти поля обязательны, т.к. они используются как ключ для кэширования.
7: string setName = request["s"] ?? string.Empty;
8: string contentType = request["t"] ?? string.Empty;
9: string version = request["v"] ?? string.Empty;
10:
11: // Определяем, позволяет ли браузер сжатие контента
12: bool isCompressed = DO_GZIP && this.CanGZip(context.Request);
13:
14: // Ответ формируем в UTF8 кодировке
15: UTF8Encoding encoding = new UTF8Encoding();
16:
17: // Если ресурс есть в кэше, то берем из кэша.
18: // В противном случае, считываем файлы, объединяем и кладем в кэш
19: if (!this.WriteFromCache(context, setName, version, isCompressed, contentType))
20: {
21: using (MemoryStream memoryStream = new MemoryStream(5000))
22: {
23: // Определяем тип потока, в который будем писать результат
24: using (Stream writer = isCompressed ?
25: (Stream)(new GZipStream(memoryStream, CompressionMode.Compress)) :
26: memoryStream)
27: {
28:
29: // Загружаем файлы, основываясь на ключе в <appSettings>
30: string setDefinition =
31: System.Configuration.ConfigurationManager.AppSettings[setName] ?? "";
32: string[] fileNames = setDefinition.Split(new char[] { ',' },
33: StringSplitOptions.RemoveEmptyEntries);
34: string delimeter = "\r\n";
35: foreach (string fileName in fileNames)
36: {
37: //Добавляем разделитель, чтобы в двух соседних файлах не произошло объединения ключевых слов.
38: byte[] bytes = encoding.GetBytes(delimeter);
39: writer.Write(bytes, 0, bytes.Length);
40:
41: string text = GetFileText(context, fileName.Trim(), encoding);
42: byte[] fileBytes = encoding.GetBytes(text);
43: writer.Write(fileBytes, 0, fileBytes.Length);
44: }
45:
46: writer.Close();
47: }
48:
49: //Кэшируем результат
50: byte[] responseBytes = memoryStream.ToArray();
51: context.Cache.Insert(GetCacheKey(setName, version, isCompressed),
52: responseBytes, null, System.Web.Caching.Cache.NoAbsoluteExpiration,
53: CACHE_DURATION);
54:
55: // Генерируем ответ
56: this.WriteBytes(responseBytes, context, isCompressed, contentType);
57: }
58: }
59: }