È possibile controllare il codice LinkTagHelper
fonte, dove potrete vedere è fondamentalmente l'aggiunta di una stringa di query di versione per il valore href tramite una FileVersionProvider
:
if (AppendVersion == true)
{
EnsureFileVersionProvider();
if (Href != null)
{
output.Attributes[HrefAttributeName].Value = _fileVersionProvider.AddFileVersionToPath(Href);
}
}
private void EnsureFileVersionProvider()
{
if (_fileVersionProvider == null)
{
_fileVersionProvider = new FileVersionProvider(
HostingEnvironment.WebRootFileProvider,
Cache,
ViewContext.HttpContext.Request.PathBase);
}
}
Il FileVersionProvider
sarà calcolare l'hash del contenuto dei file utilizzando l'algoritmo SHA256
. Sarà quindi url codificarlo e aggiungerlo alla stringa di query come in:
path/to/file?v=B95ZXzHiOuQJzhBoHlSlNyN1_cOjJnz2DFsr-3ZyyJs
L'hash viene ricalcolato solo quando il file cambia, in quanto viene aggiunto alla cache, ma con un trigger di scadenza sulla base di un file watcher:
if (!_cache.TryGetValue(path, out value))
{
value = QueryHelpers.AddQueryString(path, VersionKey, GetHashForFile(fileInfo));
var cacheEntryOptions = new MemoryCacheEntryOptions().AddExpirationToken(_fileProvider.Watch(resolvedPath));
_cache.Set(path, value, cacheEntryOptions);
}
questo watcher è fornito da HostingEnvironment.WebRootFileProvider
, che implementa IFileProvider
:
//
// Summary:
// Creates a change trigger with the specified filter.
//
// Parameters:
// filter:
// Filter string used to determine what files or folders to monitor. Example: **/*.cs,
// *.*, subFolder/**/*.cshtml.
//
// Returns:
// An Microsoft.Framework.Caching.IExpirationTrigger that is triggered when a file
// matching filter is added, modified or deleted.
IExpirationTrigger Watch(string filter);
Nota: È possibile visualizzare i valori memorizzati nella cache da soli controllando i valori nella IMemoryCache
:
//give the link:
<link rel="stylesheet" asp-append-version="true" href="~/css/site.css" />
//You can check the cached version
this.Context.RequestServices.GetRequiredService<IMemoryCache>().Get("/css/site.css")
//Which will show a value like:
/css/site.css?v=B95ZXzHiOuQJzhBoHlSlNyN1_cOjJnz2DFsr-3ZyyJs
Grazie, che risponde a tutto! –
Guardando il codice sorgente, sembra che 'asp-append-version' funzioni solo con' WebRootFileProvider'. C'è un modo per farlo funzionare con file al di fuori della directory 'wwwroot' servita da un' PhysicalFileProvider'? – AxiomaticNexus
@AxiomaticNexus Non sembra esserci alcun gancio per utilizzare un diverso 'FileVersionProvider' che si creerebbe usando' IHostingEnvironment.ContentRootFileProvider' (anche se 'FileVersionProvider' dipende da' IFileProvider' quindi in teoria funzionerebbe bene con 'ContentRootProvider'). Immagino che il tag helper sia stato progettato con i file di wwwroot in mente, forse vale la pena raggiungere MS su github. –