Размещение GWT Webapp в IIS - PullRequest
       42

Размещение GWT Webapp в IIS

1 голос
/ 28 января 2012

В настоящее время я пытаюсь настроить веб-приложение ASP.net через Web.config, чтобы разместить GWT WebApp в определенной папке.Мне удалось настроить mimeMap для расширения файла .manifest в разделе system.Webserver / staticContent, однако я застрял в clientCache.Я хочу добавить правило кэширования, чтобы файлы с ".nocache".подаются со следующими заголовками:

"Expires", "Sat, 21 Jan 2012 12:12:02 GMT" (today -1);
"Pragma", "no-cache"
"Cache-control", "no-cache, no-store, must-revalidate"

Кто-нибудь знает, как это сделать в IIS 7+?

Ответы [ 3 ]

1 голос
/ 17 марта 2013

Метка времени файла автоматически проверяется в IIS, и браузер всегда запрашивает у сервера обновленный файл на основе метки времени, то есть .nocache.файлам не нужно ничего особенного в IIS.

Однако, если вы хотите, чтобы браузер кэшировал .cache.файлы, а затем следующий HttpModule устанавливает дату истечения срока действия кеша через 30 дней для файлов, которые заканчиваются на .cache.js или .cache.html (или любое расширение).Браузер даже не будет запрашивать обновленные версии этих файлов.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace CacheModulePlayground
{
    public class CacheModule : IHttpModule
    {
        private HttpApplication _context;


        public void Init(HttpApplication context)
        {
            _context = context;
            context.PreSendRequestHeaders += context_PreSendRequestHeaders;
        }

        void context_PreSendRequestHeaders(object sender, EventArgs e)
        {

            if (_context.Response.StatusCode == 200 || _context.Response.StatusCode == 304)
            {
                var path = _context.Request.Path;

                var dotPos = path.LastIndexOf('.');
                if (dotPos > 5)
                {
                    var preExt = path.Substring(dotPos - 6, 7);
                    if (preExt == ".cache.")
                    {
                        _context.Response.Cache.SetExpires(DateTime.UtcNow.Add(TimeSpan.FromDays(30)));
                    }
                }

            }

        }


        public void Dispose()
        {
            _context = null;
        }
    }
}

Файл web.config для этого:

<configuration>
    <system.web>
      <compilation debug="true" targetFramework="4.5" />
      <httpRuntime targetFramework="4.5" />
    </system.web>
  <system.webServer>
    <modules>
      <add name="cacheExtension" type="CacheModulePlayground.CacheModule"/>
    </modules>
  </system.webServer>
</configuration>
0 голосов
/ 25 июля 2014
  1. Создание класса модуля HTTP в файле GwtCacheHttpModuleImpl.cs

    using System;
    using System.Web;
    using System.Text.RegularExpressions;
    
    namespace YourNamespace
    {
        /// <summary>
        /// Classe GwtCacheHttpModuleImpl
        /// 
        /// Permet de mettre en cache pour un an ou pas du tout les fichiers générés par GWT
        /// </summary>
        public class GwtCacheHttpModuleImpl : IHttpModule
        {
    
            private HttpApplication _context;
    
            private static String GWT_FILE_EXTENSIONS_REGEX_STRING = "\\.(js|html|png|bmp|jpg|gif|htm|css|ttf|svg|woff|txt)$";
    
            private static Regex GWT_CACHE_OR_NO_CACHE_FILE_REGEX = new Regex(".*\\.(no|)cache" + GWT_FILE_EXTENSIONS_REGEX_STRING);
            private static Regex GWT_CACHE_FILE_REGEX = new Regex(".*\\.cache" + GWT_FILE_EXTENSIONS_REGEX_STRING);
    
            #region IHttpModule Membres
    
            public void Dispose()
            {
                _context = null;
            }
    
            public void Init(HttpApplication context)
            {
                context.PreSendRequestHeaders += context_PreSendRequestHeaders;
                _context = context;
            }
    
            #endregion
    
            private void context_PreSendRequestHeaders(object sender, EventArgs e)
            {
                int responseStatusCode = _context.Response.StatusCode;
    
                switch (responseStatusCode)
                {
                    case 200:
                    case 304:
                        // Réponse gérée
                        break;
                    default:
                        // Réponse non gérée
                        return;
                } /* end..switch */
    
    
                String requestPath = _context.Request.Path;
    
                if (!GWT_CACHE_OR_NO_CACHE_FILE_REGEX.IsMatch(requestPath))
                {
                    // Fichier non géré
                    return;
                }
    
                HttpCachePolicy cachePolicy = _context.Response.Cache;
    
                if (GWT_CACHE_FILE_REGEX.IsMatch(requestPath))
                {
                    // Fichier à mettre en cache
                    cachePolicy.SetExpires(DateTime.UtcNow.Add(TimeSpan.FromDays(365))); /* now plus 1 year */              
                }
                else
                {
                    // Fichier à ne pas mettre en cache
                    cachePolicy.SetExpires(DateTime.UtcNow); /* ExpiresDefault "now" */
                    cachePolicy.SetMaxAge(TimeSpan.Zero); /* max-age=0 */
                    cachePolicy.SetCacheability(HttpCacheability.Public); /* Cache-Control public */
                    cachePolicy.SetRevalidation(HttpCacheRevalidation.AllCaches); /* must-revalidate */
                }
    
            }
        }
    }
    
  2. Ссылка на модуль HTTP в файле Web.Config:

  3. Обработка расширения файла GWT через модуль ISAPI

Вы должны настроить приложение через интерфейс IIS (в моем случае IIS 5.x и .NET 3.5).Вы можете добавить другие расширения GWT, такие как png, css, ...

a) Обрабатывать расширение .js

Исполняемый файл: c: \ windows \ microsoft.net \ framework \ v2.0.50727 \ aspnet_isapi.dll

Расширение: .js

Ограничение: GET, HEAD

b) Обработка расширения .html

Исполняемый файл: c: \ windows \ microsoft.net \ framework \ v2.0.50727 \ aspnet_isapi.dll

Расширение: .html

Ограничение: GET, HEAD

Ссылка: GWT Perfect Caching для сервера Apache

0 голосов
/ 30 января 2012

Я закончил тем, что создал собственный httphandler для обработки всех запросов к пути .nocache. , используя решение, аналогичное описанному здесь:

Предотвращение программного кэширования сценариев

...