Alguns navegadores armazenam arquivos js e css em cache, deixando de atualizá-los, a menos que você os force a fazer isso. Qual é a maneira mais fácil.
Acabei de implementar esta solução que parece funcionar.
Declare uma variável de versão em sua página
public string version { get; set; }
Obtenha o número da versão da chave web.config
version = ConfigurationManager.AppSettings["versionNumber"];
Em sua página aspx, faça chamadas para javascript e folhas de estilo assim
<script src="scripts/myjavascript.js?v=<%=version %>" type="text/javascript"></script>
<link href="styles/mystyle.css?v=<%=version %>" rel="stylesheet" type="text/css" />
Portanto, se você definir a versão = 1.1 de 1.0 em seu web.config, seu navegador fará o download dos arquivos mais recentes, o que, com sorte, evitará que você e seus usuários frustem alguma coisa.
Existe outra solução que funcione melhor ou isso causará problemas imprevistos para um site?
javascript
c#
asp.net
.net
asp.net-mvc
kiev
fonte
fonte
Respostas:
Resolvi isso acrescentando um carimbo de data / hora da última modificação como um parâmetro de consulta aos scripts.
Eu fiz isso com um método de extensão e usando-o em meus arquivos CSHTML. Observação: esta implementação armazena em cache o carimbo de data / hora por 1 minuto para que não mexamos tanto no disco.
Aqui está o método de extensão:
E então na página CSHTML:
No HTML renderizado, isso aparece como:
fonte
Sua solução funciona. Na verdade, é bastante popular.
Até o Stack Overflow usa um método semelhante:
Onde
v=6184
está provavelmente o número de revisão do SVN.fonte
No ASP.NET Core (MVC 6), isso funciona imediatamente por meio do
asp-append-version
assistente de tag:fonte
A ASP.NET MVC cuidará disso para você se você usar pacotes para seu JS / CSS. Ele anexará automaticamente um número de versão na forma de um GUID aos seus pacotes e apenas atualizará esse GUID quando o pacote for atualizado (também conhecido como qualquer um dos arquivos de origem tem alterações).
Isso também ajuda se você tiver uma tonelada de arquivos JS / CSS, pois pode melhorar muito o tempo de carregamento do conteúdo!
Veja aqui
fonte
Há uma maneira integrada no asp.net para isso: agrupamento . Apenas use. Cada nova versão terá o sufixo exclusivo "? V = XXXXXXX". No modo de depuração, o agrupamento está desativado, para ativar a configuração do make em web.config:
Ou adicione ao método RegisterBundles (bundleCollection bundles):
Por exemplo:
BundleConfig.cs:
_Layout.cshtml:
fonte
Há uma resposta mais simples para isso do que a resposta dada pelo op na pergunta (a abordagem é a mesma):
Defina a chave no web.config:
Faça a chamada para appsettings diretamente da página aspx:
fonte
Baseado na resposta de Adam Tegan , modificada para uso em um aplicativo de formulários da web.
No código da classe .cs:
Na marcação aspx:
E no HTML renderizado, ele aparece como
fonte
Curiosamente, este mesmo site tem problemas com a abordagem que você descreve em relação a algumas configurações de proxy, embora deva ser à prova de falhas.
Verifique esta discussão do Meta Stack Overflow .
Portanto, à luz disso, pode fazer sentido não usar um parâmetro GET para atualizar, mas o nome do arquivo real:
embora isso seja mais trabalho a fazer, já que você terá que realmente criar o arquivo ou construir uma reescrita de URL para ele.
fonte
Eu queria um liner simples para tornar o caminho exclusivo para invadir o cache. Isso funcionou para mim:
Se o arquivo foi modificado desde a última vez que foi carregado na página, o navegador puxará o arquivo atualizado.
Ele gera o
last modified
carimbo do.js
arquivo e o coloca ali, em vez da versão à qual pode não ser fácil obter acesso.Outra opção pode ser obter a soma de verificação do arquivo.
fonte
Aqui está uma abordagem que funciona com ASP.NET 5 / MVC 6 / vNext .
Etapa 1: Crie uma classe para retornar a hora da última gravação do arquivo, semelhante a outras respostas neste tópico. Observe que isso requer injeção de dependência ASP.NET 5 (ou outra).
Etapa 2: Registre o serviço a ser injetado dentro startup.cs :
Etapa 3: então, no ASP.NET 5, é possível injetar o serviço diretamente em uma visualização de layout, como _Layout.cshtml, como este:
Existem alguns toques finais que podem ser feitos para combinar melhor os caminhos físicos e lidar com o nome do arquivo em um estilo mais consistente com a sintaxe, mas este é um ponto de partida. Espero que ajude as pessoas a migrar para o ASP.NET 5.
fonte
Empreguei uma técnica ligeiramente diferente no meu site aspnet MVC 4:
_ViewStart.cshtml:
Em seguida, nas visualizações reais:
fonte
<?php $rand_no = rand(10000000, 99999999)?> <script src="scripts/myjavascript.js?v=<?=$rand_no"></script>
Isso funciona para mim em todos os navegadores. Aqui eu usei o PHP para gerar um número aleatório. Você pode usar sua própria linguagem do lado do servidor.
fonte
A partir da resposta acima , modifiquei um pouco o código para fazer o auxiliar trabalhar com arquivos CSS também e adicionar uma versão toda vez que você fizer alguma alteração nos arquivos e não apenas quando fizer a construção
fonte
Obtenha a hora de modificação do arquivo, conforme mostrado abaixo
Anexe isso com input como querystring
Chame isso de marcação.
Abordagem MVC Extension Helper
Adicionar um método de extensão
Adicione este namespace em web.config
Use-o para ver como
fonte
Sugestões anteriores simplificadas e fornecimento de código para desenvolvedores de formulários da Web em .NET.
Isso aceitará urls relativos ("~ /") e absolutos no caminho do arquivo para o recurso.
Coloque em um arquivo de classe de extensões estáticas, o seguinte:
E então chame-o em sua página mestra como tal:
fonte
Com base na resposta acima, escrevi uma pequena classe de extensão para trabalhar com arquivos CSS e JS:
Em vez de escrever algo como:
Agora você pode escrever:
Ou seja, simplesmente substitua
Url.Content
porUrl.VersionedContent
.Os URLs gerados são semelhantes a:
Se você usar a classe de extensão, você pode querer adicionar tratamento de erros caso a
MapPath
chamada não funcione, já quecontentPath
não é um arquivo físico.fonte
Eu uso uma maneira semelhante para fazer o mesmo que você está fazendo, sem modificar cada página. Adicionado um evento PreRender é um arquivo mestre. Ele mantém minha lógica em um lugar e aplicável a arquivos js e css.
fonte
Você pode substituir a propriedade DefaultTagFormat de Scripts ou Estilos.
fonte
Para resolver esse problema em meu aplicativo ASP.Net Ajax, criei uma extensão e chamei a página mestra.
Para mais detalhes, você pode acessar o link .
fonte
Maneira fácil e inteligente de implementar o controle de versão de css no aplicativo .net pelo conceito abaixo ... sem necessidade de escrever código de back-end.
fonte
O principal problema em fazer isso dessa maneira é principalmente que você precisará se lembrar de atualizar o número da versão no código toda vez que fizer qualquer alteração nos arquivos css ou js.
Uma maneira possivelmente melhor de fazer isso é definir um parâmetro exclusivo garantido com cada um dos seus arquivos css ou js, assim:
Isso força os arquivos a serem solicitados do servidor todas as vezes, o que também significa que seu site não terá o mesmo desempenho no carregamento da página, pois esses arquivos nunca serão armazenados em cache e usarão largura de banda desnecessária todas as vezes.
Essencialmente, se você se lembrar de atualizar o número da versão toda vez que uma alteração for feita, você poderá fazer o que está fazendo.
fonte
Para páginas ASP.NET, estou usando o seguinte
ANTES
DEPOIS (forçar recarga)
Adicionar o DateTime.Now.Ticks funciona muito bem.
fonte