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.

Azure Website Dynamic Cache website_local_cache_option

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:

Firefox disable cache

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.

Azure Portal webapp stop

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:

Azure Linux Web App Edit Publish Profile

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 om az account show misslyckas (dvs du inte är inloggad). Detta så du inte i onödan får en inloggningsprompt.
  • az webapp stop och az 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:

Azure Web App Stopped

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!

Relaterade Artiklar