Description
We are encountering an incomprehensible issue where the update process keeps repeating.
On the customer's PC, we observe that updates continue to repeat.
I also noticed this issue on my own PC, and it seemed to be resolved by adding ResponseCache.
However, the issue still persists on several of the customer's PCs.
The server is running on IIS with .NET 9. The client is installed using a Windows Installer and updated via AutoUpdater.NET.
Below is part of the server-side code:
[HttpGet("{tenantName}/{MacAddress}/{AppId}/Download")]
[DontWrapResult]
[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None, Duration = 0)]
public async Task DownloadAsync([FromRoute] string tenantName, [FromRoute] string MacAddress, [FromRoute] string AppId)
{
HttpContext.Response.Clear();
HttpContext.Response.ContentType = "application/octet-stream";
HttpContext.Response.Headers.Append("Content-Disposition", $"attachment; filename=\"{System.IO.Path.GetFileName(deploy.FilePath!)}\"");
HttpContext.Response.Headers.Append("Content-Length", fileinfo.Length.ToString());
HttpContext.Response.Headers.Append("Content-Transfer-Encoding", "binary");
HttpContext.Response.Headers.Append("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0");
HttpContext.Response.Headers.Append("Pragma", "no-cache");
HttpContext.Response.Headers.Append("Expires", "0");
await HttpContext.Response.SendFileAsync(deploy.FilePath);
}
Although I used ResponseCache to prevent caching, it didn’t solve the problem, so I added the headers manually.
I confirmed that the headers are indeed being sent.
In the AutoUpdater.cs, I also found the following code:
internal static MyWebClient GetWebClient(Uri uri, IAuthentication basicAuthentication)
{
var webClient = new MyWebClient
{
CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore)
};
if (Proxy != null)
{
webClient.Proxy = Proxy;
}
if (uri.Scheme.Equals(Uri.UriSchemeFtp))
{
webClient.Credentials = FtpCredentials;
}
else
{
basicAuthentication?.Apply(ref webClient);
webClient.Headers[HttpRequestHeader.UserAgent] = HttpUserAgent;
}
return webClient;
}
As you can see, caching is explicitly disabled using RequestCacheLevel.NoCacheNoStore.
Despite all this, the update still appears to be cached, and I don’t understand why.
When using ClickOnce, we never experienced this kind of issue, even though we’re using the same IIS server instance.
Could it be related to temporary files used during the download process?