Azure Web App uppdateras inte efter publicering
Har du problem med att din Azure Web App inte uppdateras efter att du publicerar från Visual Studio eller annat verktyg? Jag har haft dessa problem med mina Azure Linux ASP.NET Core Apps, men du kan råka ut för dem med alla typer av Azure Web Apps (samt även Azure Functions). Jag skall förklara hur jag löste dessa problem och varför de inträffade.
Detta är faktiskt ganska vanliga problem. Här är ett exempel från Stack Overflow.
Låt oss titta steg för steg på hur vi löser uppdateringsproblemen.
Steg 1 - Cachning på Servern
Azure Web Apps har två inställningar, WEBSITE_DYNAMIC_CACHE och WEBSITE_LOCAL_CACHE_OPTION, som styr deras filcachningsbeteende. By default så läser de INTE direkt från Azure Storage där publicerade filer skrivs.
Du kan lägga till application settings WEBSITE_DYNAMIC_CACHE=0
och WEBSITE_LOCAL_CACHE_OPTION=Never
för att stänga av all filcachning. Denna artikel beskriver hur du ändrar på cachningen.

Steg 2 - Cachning i Webbrowsern
Har du verkligen dubbelkontrollerat att din web app inte är cachad i din lokala webbrowser?
Att bara klicka på Refresh-knappen i din browser leder inte nödvändigtvis till att dina resurser laddas om. Bilder, script, css-filer, stannar normalt i din browser cache även efter omladdning av en sida. Stänga av eller töm cachen!
Som exempel, så här stänger du av cachen i Firefox:

Så också till att du inte är ansluten via en web proxy som cachar din web app.
Steg 3 - Fillåsningsproblem
Fillåsningsproblem är vanliga i ASP.NET Core. Detta är för att .NET Core saknar shadow copying beteendet i .NET Framework.
Använda Deployment Slots
Deployment Slots är toppen, men de löser inte dina uppdateringsproblem. En slot beter sig som en web app och du får samma fillåsningsproblem inom en slot.
Manuell Take Offline / Take Online
Quick-and-dirty-metoden för att fixa fillåsningsproblem är att manuellt stoppa din web app innan uppdateringen och att sedan starta den efter att uppdateringen är klar.

Se till att du stoppar din web app, inte bara klickar på restart.
Automatisk Take Offline / Take Online
app_offline.htm
IIS har en speciell funktion för att ta ned websites och visa ett underhållsmeddelande. Om du placerar en fil med namnet app_offline.htm
i webrooten så stängs din web app ned och all trafik skickas till app_offline.htm. Du kan modifiera din publish profile så att den placerar denna fil i webrooten och sedan tar bort den efter att publiceringen är klar.
Tyvärr fungerar detta inte på Azure Linux Web Apps. De använder inte IIS.
Package Deployment Mode
Package Deployment Mode betyder att du laddar upp hela din filstruktur som en enda zip-fil och att web appen körs direkt från zip-filen. Om du bara ser till att zipfilen alltid får ett unikt namn så hamnar du aldrig i några fillåsningsproblem.
Detta fungerar bra även för Azure Linux Web Apps, men det fungerar inte för alla appar. I denna artikel, beskriver jag Package Deployment mode och hur du kan ställa in det.
Använd Azure CLI
Azure CLI kan användas för att utföra de flesta Azure uppgifter och det kan enkelt användas från Visual Studio Publish Profiles. Ladda ned och installera Azure CLI härifrån om du inte redan har det.
Du måste redigera din Publish Profile manuellt. Öppna .pubxml-filen för redigering:

Lägg till följande kod innan </Project>-taggen i slutet av din .pubxml fil.
1 <Target Name="CustomActionsBeforePublish" BeforeTargets="BeforePublish">
2 <Exec Command='az account show' WorkingDirectory="C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\" ContinueOnError="true" StandardOutputImportance="low" StandardErrorImportance="low"/>
3 <Exec Command='az login' WorkingDirectory="C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\" Condition="$(MSBuildLastTaskResult) == false" StandardOutputImportance="low" StandardErrorImportance="low" />
4 <Exec Command='az account set --subscription "my subscription"' WorkingDirectory="C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\" />
5 <Exec Command='az webapp stop --resource-group "my resource group" --name "app name"' WorkingDirectory="C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\" />
6 </Target>
7
8 <Target Name="CustomActionsAfterPublish" AfterTargets="AfterPublish">
9 <Exec Command='az webapp start --resource-group "my resource group" --name "app name"' WorkingDirectory="C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\" />
10 </Target>
Uppdatera med din subscription, resource group och app name. Updatera sökvägen till WorkingDirectory om din Azure CLI är installerar någon annanstans.
Så här fungerar scriptet:
az account show
är bara till för att kontrollera om du är inloggad i Azure CLI.az login
exekveras bara omaz account show
misslyckas (dvs du inte är inloggad). Detta så du inte i onödan får en inloggningsprompt.az webapp stop
ochaz webapp start
gör jobbet åt dig.
Notera att Visual Studio kommer att försöka öppna din web app i browsern innan den är färdig med uppstarten. Därför kommer du förmodligen att få se denna skärm:

Om det får ovanstående felmeddelande så bara ladda om sidan din web browser. Din webb app skall strax vara igång.
Om den fortfarande inte uppdaterar
Dessa är orsakerna jag har träffat på hittills. Om du tror att du har stött på ett fall av en web app som inte uppdateras och inte går att lösa med dessa steg så är jag nyfiken på att få höra!