ARR - desativa dinamicamente o armazenamento em cache de disco para determinadas solicitações (usuários autenticados)

1

Trata-se de Roteamento de Solicitação de Aplicativo e desativa dinamicamente o armazenamento em cache de disco para determinadas solicitações (onde as solicitações vêm de usuários autenticados; se elas são autenticadas podem ser decididas por código personalizado).

Na minha configuração, há um servidor executando ARR, enviando solicitações para um site ASP.NET MVC em um servidor diferente. O site usa Autenticação de Formulários (e, às vezes, autenticação básica HTTP), portanto, a autenticação ocorre no site do MVC, não no ARR: basicamente quando o usuário autentica o site cria um cookie de Autenticação de Formulários.

Gostaria que o seguinte acontecesse na ARR:

  • Fazer cache de saída para usuários anônimos.
  • Para usuários autenticados, apenas faça cache de arquivos estáticos (por exemplo, arquivos .css, .js, .jpg) e não armazene em cache páginas dinâmicas.

Como é possível ter uma regra de configuração de cache para este cenário? Eu tentei várias maneiras:

  • Cabeçalhos de cache: os cabeçalhos de controle de cache enviados pelo aplicativo MVC não são utilizáveis aqui, porque imagine isto: a página 1 está no cache de ARR. O usuário autentica e visita a página 1. O aplicativo MVC envia um cabeçalho sem cache, mas a solicitação não está chegando, portanto, o usuário obtém a versão em cache.
  • URLs sem cache: embora provavelmente a definição de URLs com "no-arr-cache" não deva ser armazenada em cache, a regravação de URL funcionaria, ou seja, com um provedor de regravação de URL personalizado, eu reescreveria solicitações autenticadas. .. no-arr-cache. Além das regras de controle de cache da ARR que não se importam com as strings de consulta, o problema é que a ARR considera apenas as URLs solicitadas quando uma regra de configuração de cache é avaliada, não a URL reescrita.

Obrigado antecipadamente!

Eu fiz um cross-post do Fóruns do IIS porque ninguém respondeu lá.

    
por Piedone 21.12.2013 / 14:10

2 respostas

1

Foi assim que resolvi isso.

Precisamos ter as seguintes premissas em mente:

  • ARR identifica itens em cache com sua URL (que, dependendo da configuração, inclui a string de consulta; essa deve ser a configuração).
  • Durante uma solicitação, o ARR pode ser instruído a não armazenar em cache a saída da solicitação atual.
  • Se a saída da solicitação atual (URL) foi armazenada em cache antes, não é possível saber como instruir a ARR a não usar a versão em cache.

A grande ideia é alterar o URL do pedido, ou melhor, reescrevê-lo de forma diferente com o URL do IIS, reconfigurando, dependendo se o usuário é autenticado ou não. Usuários não autenticados obtêm todas as páginas exibidas com, por exemplo, / my-page? autenticado = falso e autenticado com / my-page? authenticated = true. As páginas serão armazenadas em cache apenas para usuários anônimos, para que o ARR não encontre nenhuma entrada de cache correspondente para usuários autenticados. Assim, o terceiro ponto é resolvido. No lado negativo, a string de consulta que você anexa aos URLs pode aparecer no corpo HTML, e eles devem ser removidos com o URL do IIS Rewrite.

Para instruir a ARR a não armazenar em cache a solicitação atual, defina a variável de servidor ARR_CACHE_CONTROL_OVERRIDE como "1, no-cache" (isso pode ser feito a partir de regras de reconfiguração).

Você pode detectar se o usuário é autenticado a partir de uma URL do IIS. Voltar ao topo rewrite-provider-for-url-rewrite-module "> tutorial ), ou seja, você pode usar a saída de um provedor para reescrever a URL de forma diferente para usuários autenticados e anônimos.

Espero que ajude alguém.

    
por 27.12.2013 / 23:22
0

Configurar o controle de cache só funciona com o HTTP / 1.1, para desativar o cache de navegadores antigos do IE, você precisa configurar

  • Cache-control: no-cache
  • Pragma: no-cache

O artigo a seguir fornece mais detalhes sobre isso: Desativar o cache no ARR

    
por 30.01.2015 / 09:52

Tags