æ¬çªIISãµãŒããŒã§FTPã䜿çšããŠ.NETCoreã¢ããªã±ãŒã·ã§ã³DLLãã¡ã€ã«ãäžæžãããããšãããšããã¡ã€ã«ãããã¯ãããäžæžãã§ããŸããã
æ°ããããŒãžã§ã³ãå±éããã«ã¯ãIISã§ã¢ããªã±ãŒã·ã§ã³ãåæ¢ããŠããã¯ã解é€ããŠãããäžæžãããå¿
èŠããããŸãã
ã¢ããªã±ãŒã·ã§ã³ãåæ¢ããã«ãããã€ããããšã¯ã§ããŸããã
app_offline.htmãåç §ããŠãã ããïŒ https ïŒ//docs.asp.net/en/latest/hosting/aspnet-core-module.html#asp -net-core-module-app-offline-htm
PowerShellã®æ¹æ³ãå¿ èŠãªå Žåã¯ãIIS管çã³ãã³ãã¬ããã䜿çšã§ããŸãïŒ https ïŒ
Stop-WebAppPool -Name $appPoolName
... deploy ...
Start-WebAppPool -Name $appPoolName
説æãããããšã@Tratcher ã
ãããããªãã®èšç»ã«ãããã©ããã¯ããããŸããããããã¯ä»¥åã®ASP.NET MVCã§æ©èœãããšæããŸããïŒ
ãã®æ©èœãå®è£
ããäºå®ã¯ãããŸããïŒ
@GuardRexå ±æãã¹ãã£ã³ã°ç°å¢ã§ãããAppPoolãåæ¢ããæš©éããªããããå®è¡ã§ããŸãã
msdeploy.exeãšAzureã§ãæ£ããæ©èœãããããã«ã§ããŸããïŒ ç§ãæ£ããç解ããŠããå Žåã¯ããã¡ã€ã«ããã¯ãé²ãããã«Webãµã€ããåèµ·åããå¿
èŠããããŸãã -enableRule:AppOffline
æ©èœããŸãããWebãµã€ãå
šäœãæ°åéãªãã©ã€ã³ã«ãªããŸããããã¯ãç¹ã«1æ¥ã«æ°åå±éããããšãèãããšãåªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã§ã¯ãããŸããã
http://stackoverflow.com/q/40276582/14131ãåç §ããŠ
@chuchuvaãããããŸãããããã¹ãŠã®éæ³ã«ã¯ã³ã¹ãã䌎ããŸãã 以åã®ããŒãžã§ã³ã®ASP.NETã¯ããã¡ã€ã«ããã¯ã®åé¡ãåé¿ããããã«ãããã€ãã®è€éãªã·ã£ããŠã³ããŒãå®è¡ããŠããŸããã
éæ³ãã©ãããããã¯ããŸããããŸããã ASP.NETã³ã¢ãžã®ç§»è¡åŸãä»ã¯ã¡ãã£ãšæãããã§ã...
@HarelMã«åæããŸããã èªåå±éãããšã³ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãŸã§ãããã«é¢ããåé¡ãçºçããŸããã å€ãMVCã䜿çšãã1æ¥çŽ10åã®ãããã€ãããããããå€éã®æ¯æ¥ã®ãããã€ã«ç§»è¡ããCoreã¢ããªã䜿çšããŠãããŠãŒã¶ãŒããªãã©ã€ã³ã«ãããšã€ã©ã€ã©ããããšãåãå ¥ããŸããã ã·ã§ãŒã¹ããããŒã§ã¯ãããŸããããã³ã¢ã®æ¡çšã«åããŠæ©æŠãå ãããŸãã
ð
éè€ãããªãµã€ã¯ã«ããµããŒãããªãããšã¯ååž°ã§ãã
ãã®æ©èœãåæ€èšããŠããŒããããã«èŒããäºå®ã¯ãããŸããïŒ ããŠã³ã¿ã€ã ãŒãã®å±éããµããŒããããå Žåã.Net Core Webãµã€ããå±éãããã¹ãŠã®äººã«ãã¹ããŒãžã³ã°ã¹ãããæŠç¥ãæåã§å®è£ ããããã«èŠæ±ããããšã¯éåžžã«äžäŸ¿ã§äžäŸ¿ã§ãã
ãã®æ©èœã䜿çšãããšãå€ãã®äººã«ãšã£ãŠ.Net Core Webãµã€ããžã®ç§»è¡ãã¯ããã«ã¹ã ãŒãºã«ãªãã.Net CoreWebãµã€ããããè¿ éã«æ¡çšã§ããããã«ãªããŸãã
ç§ãã¡ãç¥ãããã§ãã app_offline.htmãapplicationsãã£ã¬ã¯ããªå ã«é 眮ããŠãæ©èœããŸããã
å€ãã®ãµã€ããAspNetCoreã«ç§»è¡ããåŸããã®ãæ©èœãã«æ°ä»ããã°ããã§ãã å ¬éãããã³ã«ãµã€ããæ°åéãªãã©ã€ã³ã«ããããšã¯èš±å®¹ã§ãããšã¯æããŸããã
ããã¯ãå°ããªããŒã ã®ãªãŒããŒãšããŠã®ç§ã«ãšã£ãŠã¯ååã«æªãããšã§ã-倧èŠæš¡ãªåé¿çAspNetCoreã§ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ãå®è·µããŠãã人ã¯ããŸããïŒ åå ¬éããããã«ã1æéããšã«æ°åéãµã€ãããªãã©ã€ã³ã«ããæ¹æ³ã¯ãããŸããã
FTPãŸãã¯xcopyingã䜿çšããŠå±éããŠããŸããïŒ ãŸãã¯ãwebdeployã䜿çšããŠããŸããïŒ
webdeployãä»ããŠIISã«å ¬éããŠããŸãã
çŸåšãæåã«web.configãåé€ããïŒäºå®äžã¢ããªã±ãŒã·ã§ã³ã匷å¶çµäºããïŒããšã§ãã®åé¡ãåé¿ããŠããŸãããããã¯é·æçã«ã¯å®éã«ã¯åãå ¥ãããã解決çã§ã¯ãããŸããã
@DaleMckeownã¯ãçæ³çã«ã¯ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã¯ãŒã¯ãããŒã䜿çšããŠãããŒããã©ã³ãµãŒã®èåŸã«è€æ°ã®ãµãŒããŒãé 眮ããŸãã 次ã«ã1ã€ã®ãµãŒããŒããã«ããŠæŽæ°ããå ã«æ»ããŠæ¬¡ã®ãµãŒããŒã«ç§»åããŸãã ãã¡ããããããåžžã«å¯èœã§ãããšã¯éããªãããïŒç§ãã¡ã®å Žåã®ããã«ïŒãæ°åã®ããŠã³ã¿ã€ã ã§ç掻ããå¿ èŠããããŸãã ç§ãã¡ã®å Žåãã¢ããªã¯30ç§ä»¥å ã«ããã¯ã¢ããããããããããã¯å®éã«ã¯åé¡ã§ã¯ãããŸããã
@DaleMckeown
webdeployãä»ããŠIISã«å ¬éããŠããŸãã
webdeployã䜿çšãããããã€ã¡ã³ããé©åã«æ©èœãããããã«äœ¿çšã§ãããªãã·ã§ã³ãããã€ããããŸãïŒããã¯ããããã¡ã€ã«ã®ååã®å€æŽãšã¢ããªã®ãªãã©ã€ã³ã®èªåããããããµããŒãããŸãïŒã ããã¯ããã©ã«ãã§@shirhattiã®å Žåã§ããïŒ
@ajeckmans
çŸåšãæåã«web.configãåé€ããïŒäºå®äžã¢ããªã±ãŒã·ã§ã³ã匷å¶çµäºããïŒããšã§ãã®åé¡ãåé¿ããŠããŸãããããã¯é·æçã«ã¯å®éã«ã¯åãå ¥ãããã解決çã§ã¯ãããŸããã
ããã¯ãxcopyå±éãè¡ã£ãŠããããšãæå³ããŸããïŒ
webdeployã䜿çšãããããã€ã¡ã³ããé©åã«æ©èœãããããã«äœ¿çšã§ãããªãã·ã§ã³ãããã€ããããŸãïŒããã¯ããããã¡ã€ã«ã®ååã®å€æŽãšã¢ããªã®ãªãã©ã€ã³ã®èªåããããããµããŒãããŸãïŒã ããã¯ããã©ã«ãã§@shirhattiã®å Žåã§ããïŒ
Davidã«æè¬ããŸã-ç§ãçŸåšè¡ã£ãŠããããšãããè¯ãé³ãããŸãïŒIISã®ãµã€ããšã¢ããªããŒã«ãæåã§åæ¢ããŸãïŒã ãããã®ã¢ãããŒãã®åœ±é¿ã調æ»ã§ããããã«ãããã€ãã®ãªãœãŒã¹ãææã§ããŸããïŒ
@DaleMckeownä¿¡é Œã§ããæ å ±æºãèŠã€ãããŸã§ã httpsïŒ //github.com/Microsoft/vsts-tasks/issues/5259#issuecomment -346202503
@davidfowl webdeployã䜿çšããŠãã¹ããµãŒããŒã«ãããã€ããŠããŸãïŒãšããã§åé¡ãçºçããããšã¯ãããŸããïŒããããããrobocopyã䜿çšããŠãã¡ã€ã«ãã©ã€ããµãŒããŒã«ã³ããŒããŸãã
@ajeckmans
çŸåšãæåã«web.configãåé€ããã ãã§ããã®åé¡ãåé¿ããŠããŸãã
web.configãå±éããåé€ããããšãIISã¯å±éããæ©å¯ãã¡ã€ã«ãæäŸããŸãã æ»æè ã¯ã30代ã®ãŠã£ã³ããŠãéããŸã§ãæŒå€ãåãããã¡ã€ã«ãç¶ç¶çã«èŠæ±ããå¯èœæ§ããããŸãã
@DaleMckeown
@ajeckmansã®ã¢ããã€ã¹ã«åŸã£ãŠãPSã¢ãããŒãã§å°ãéèã調ã¹ããå Žåã¯ãWebãã¡ãŒã å šäœã«å±éããããã«AppPoolsãäžåºŠã«1ã€ãã€ããããããããã»ã¹ãã¹ã¯ãªããåã§ããŸãã ãããè¡ãæ¹æ³ã®äŸã«ã€ããŠã¯ã httpsïŒ//github.com/guardrex/aspnetcore-iis-ps-publish ...ãåç §ããŠ
@guardrexãã®éãã§ãã æåã«app_offline.htmãdirã«ã³ããŒããŠãããweb.configãåé€ããã¢ããªã±ãŒã·ã§ã³ãã³ããŒããŠãweb.configãå ã«æ»ããapp_offlineãåé€ããŸãïŒãã¹ãŠã¹ã¯ãªããofcã䜿çšïŒã æ®å¿µãªãããapp_offlineãã¡ã€ã«ãwebsitesãã£ã¬ã¯ããªã«é 眮ããã ãã§ã¯ãdllã®ããã¯ã¯è§£é€ãããŸããã web.configãåé€ããå¿ èŠããããŸããããã¯ãå€ãasp.netãã«ã¢ããªïŒå€ãWebãã©ãŒã ãªã©ïŒã§ã¯å®è¡ããå¿ èŠã®ãªãã¢ã¯ã·ã§ã³ã§ãã
@ajeckmansããã¯ããŸããããªãã¯ãã§ãã web.configãã¡ã€ã«ãåé€ããããšãIISã¯ãã®å€æŽãããã«ååŸãããããããã©ã«ãã§éçãã¡ã€ã«ã¢ãžã¥ãŒã«ã«èŠæ±ãæž¡ãããã¡ã€ã«ã®æäŸãéå§ããå¿ èŠããããŸãã ãããè©ŠããŠããããèµ·ãããã©ããã確èªããŠãã ãã...
http://localhost:<PORT>/<ASSEMBLY_NAME>.deps.json
... PORTãšASSEMBLY_NAMEã眮ãæããŸãïŒãã¢ãžã¥ãŒã«ãåé€ããã ãã§ã¯ä¿¡çšã§ããŸãã...
<configuration>
<system.webServer>
<modules>
<remove name="StaticFileModule" />
</modules>
</system.webServer>
</configuration>
...ä»ã®ã¢ãžã¥ãŒã«ãæ®ããä»ã®æ»æãã¯ãã«ãæ瀺ããå¯èœæ§ãããããã å¿ é ã§ã¯ãªãã¢ãžã¥ãŒã«ããã¹ãŠåé€ã§ãããããããŸãããã web.configã®åé€ã«ãããããã€ã¡ã³ããã«ããŒããããã ãã«ããã®ãããªåãã§æªç¥ã®æµ·ã«çªå ¥ããŠããŸãã ããã¯å ¬åŒã¬ã€ãã³ã¹ã§ã¯ãªãã·ã§ã³ã§ã¯ãªãã£ããããå®å šã«ãµããŒããããŠããŸããã ããšãã°ãAppPoolãåæ¢ããããã®PSã¹ã¯ãªããããŸãã¯ãã®ä»ã®æŠç¥ããå§ãããŸãã
ç§ã¯ããã«åæ
ã®ã¡ã¢ãè¿œå ããå¿
èŠããããšæããŸã...ããã¯ã»ãã¥ãªãã£ã®èŠ³ç¹ããããã€ãã®çãäžããŸããã ãã®ãããã€ã¡ã³ãã¬ã€ã¢ãŠãã®å€æŽãè¡ããããšãããã¡ã€ã«ãwwwroot
ã«æ»ãããšãå«ãããããè°è«ãããŸããã...ãåç
§ããŠãã ããã
ãã£ã¹ã«ãã·ã§ã³ïŒIISã®å€æŽãweb.configã®å Žæã«å
¬éããïŒIISIntegration 158ïŒ
web.config
ãwwwroot
æ»ãéã®ããããã§ãã¯ïŒIISIntegration 164ïŒ
[ç·šé]ãããããããããªãã®ïŒãµããŒããããŠããªãïŒåé¿çã§ãïŒ web.configãwwwrootã«æ»ãã次ã«urã®å®è¡ãç¶è¡ããŸãã ããã§ã...ã¢ããªãå£ããŠãã®ããã«ãªãã©ã€ã³ã«ããã®ã¯æãã§ãã
ããã¯ãç§ãã¡ããã®ç¶æ³ã§äœããã¹ããã«ã€ããŠããã«æ··ä¹±ãããŸãã
ãã¡ã€ã«ããã¯ãåé¿ã§ããæ¹æ³ã§Webå±éãä»ããŠAspNetCoreãµã€ããIISã«å ¬éããããã®çŸåšã®æšå¥šäºé ã¯äœã§ããïŒ
ç§ãç¥ãããã§ãã ããã¯ãç§ã®çµç¹ã§.netCoreãæ¡çšããéã®å€§ããªé害ã«ãªãã€ã€ãããŸãã
.netã³ã¢Webã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããŠããŠãæ°ãããã«ããå ¬éããããšãããšãDLLã䜿çšãããŠãããšãããšã©ãŒã衚瀺ãããŸãã ãã®ãããã¢ããªããŒã«ãåæ¢ããŠãããDLLãæŽæ°ããã¢ããªããŒã«ãèµ·åããå¿ èŠããããŸãã
ã¢ããªããŒã«ãåæ¢ããã«æ°ãããã«ã/ DLLãå ¬éã§ããåé¿çã¯.NetCoreã«ãããŸããïŒ
ããã¯ãã·ã£ããŠã³ããŒã¡ã«ããºã ã䜿çšãã.Netãã¬ãŒã ã¯ãŒã¯ã§ããã©ã«ãã§ãµããŒããããŠããŸãã æ®å¿µãªããã.Net Coreã®ãªãªãŒã¹ãã2幎ãçµéããŠããããã®ãããªéåžžã«åºæ¬çã§å¿ èŠãªæ©èœã¯ãŸã ãµããŒããããŠããªãããã§ãã å°æ¥ãããä¿®æ£ããèšç»ãããããŸããïŒ
å©ããŠãããŠããããšãã
@guardrexã¢ããªãå£ããŠIISïŒãŸãã¯ããã¯ãä¿æããŠãããã®ïŒãååŸããŠdllã解æŸããã®ã¯ç¢ºãã«æãã§ãããä¿®æ£ããã°ã©ã ã補åã«ããã·ã¥ã§ããªãã®ã¯ããã«æãã§ãã åœåã®éãã¢ããªãå£ãããšãç§ãã¡ã«ã§ããå¯äžã®ããšã§ãããç§ãã¡ã¯ãããåŠçããããã®ä»ã®ããçŸä»£çãªã¢ãããŒããé »ç¹ã«æ€èšããŠããŸã:)
@ shahjay748æ¯ãæ¢ããªãã§ãã ããã ããã§ããã»ã¹ãããçŽããå Žåã¯ãã¢ããªãã³ã³ãããŒå
ã«é
眮ããæ°ããã³ã³ãããŒãé
眮ããŠãã©ãã£ãã¯ãåãæ¿ããå€ãããŒãžã§ã³ïŒãŸãã¯ãã®ãããªãã®ïŒããã«ããŠã³ããŸãã .net Coreã¯æ°ããææ°ã®æ¹æ³ããã¹ãŠã§ãããããããæ£æ°ãªããšã®ããã«æãããŸããæ°ãããã¡ã€ã«ãã³ããŒããã ãã§ã¢ããªã®æ°ããããŒãžã§ã³ãããã·ã¥ããããšã¯ãå°ãé£è§£ãªæ¹æ³ãšèŠãªãããŸãïŒåæããŸãïŒããããè¡ãã«ã¯ã
ãšãããããå€ãããã»ã¹ã§ç«ã¡åŸçããŠããç§ãã¡ãå©ããªãã®ã¯ã©ãã§ãã:)
ç§ãããŠããããšïŒãããé©åãªæ¹æ³ãã©ããã¯ããããŸããïŒã¯ããµã€ããå¥ã®ãã£ã¬ã¯ããªã«ã¢ããããŒãããiisã®ãã¹ãåãæ¿ããããšã§ã
ãã®åé¡ã«ã€ããŠå éšèª¿æ»ãè¡ããŸããã ç§ã®ç¥ãéããANCMã¯ãããã€ãããã¢ããªã±ãŒã·ã§ã³ã«ãã¡ã€ã«/ãã³ãã«ãä¿æããŠããŸããã ããã¯webdeployèªäœã«åé¡ãããããã§ããããã€ã«å€±æããŸãã app_offlineãåé€ãããåŸãæ°ååè©Šè¡ããåŸãã¢ããªã±ãŒã·ã§ã³ã®ãããã€ã«äžè²«ããŠå€±æããããšã¯ãããŸããã§ããã
ããã«PowerShellã®ç°¡åãªè£è¶³äºé ãè¿œå ããŸããã¢ããªã®ã¢ã»ã³ããªã®ããã¯ã¯åžžã«è§£æŸãããŸã...åé¡ãçºçããããšã¯ãããŸããïŒ
@ bpetersen1 ...ãã¹ããŒãžã³ã°ãã¢ãããŒãã«ã¯ãæ°ããå±éã
ããã¯ãŸã å€éšçã«è¿·æã§ã... IISãæ®ãããã«Dockerãœãªã¥ãŒã·ã§ã³ãæ€èšããããšã«ããŸããã
解決çãè©ŠããŠã¿ãŸãã ä¹ããæåŸ ã
FTPã䜿çšããŠããã®åé¡ãçºçããŠããŸãã
ããã«é¢ãããã€ã¯ããœããã®ã¢ããã€ã¹ã¯äœã§ããïŒïŒ
FTPã䜿çšããŠããã®åé¡ãçºçããŠããŸãã
ããã«é¢ãããã€ã¯ããœããã®ã¢ããã€ã¹ã¯äœã§ããïŒïŒ
appoffline.htmãã¡ã€ã«ããããããã次ã«ftpã§åé€ããŸãã
@davidfowlã¯ããããã¯ç§ãçŸåšããããã¡ã€ã«ã§è¡ã£ãŠããããšã§ãã IISãããã¯ã解é€ããŠããããã¡ã€ã«ãã³ããŒããã®ã«æ°ç§ããããŸãã
ããããšã-èå³ããªãã®ã§ãããããã¡ã€ã«ãã©ã®ããã«å®è¡ããŠããŸããïŒ
ãŸããããã«é¢ããMIcrosoftã®ããã¥ã¡ã³ããžã®ãªã³ã¯ããããããã§ãã ã°ãŒã°ã«ã§èŠã€ããããŸããã ããããšãã
@ niico100åºæ¬çã«ãããããã¡ã€ã«ã¯ãã¡ã€ã«ããããžã§ã¯ããã£ã¬ã¯ããªã«ã³ããŒããã ãã§ããããè¡ãåã«ãŸãããã¯ã¢ãããã©ã«ããäœæããŸãã ãã¡ã€ã«ãã³ããŒããåã«ãappoffline.htmããããžã§ã¯ããã©ã«ããŒã«é
眮ããŸãã
ãã¡ã€ã«ããã¯ã®åé¡ãçºçãããšãã³ããŒãåè©Šè¡ãããŸãã ç§ã¯robcopyã䜿çšããŠããŸã
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy
èå³ãããå Žåã¯ã次ã®ã¹ã¯ãªãããappveyorãããããã€ã¡ã³ããã¡ã€ã«ãããŠã³ããŒããããµã€ããåæ¢ããå¿
èŠãªãã¡ã€ã«ãã³ããŒããŠããµã€ããããã¯ã¢ããããŸãã
https://github.com/IsraelHikingMap/Site/blob/master/Scripts/Deploy.ps1
ãã ãã管çè
ãšããŠå®è¡ããå¿
èŠããããŸãã ããŸãããã°ãdockerã¯ç§»è¡ããããã®ãã³ã»ã³ã¹ããã¹ãŠè§£æ±ºããã§ããã...
Stop-WebAppPool
ããã³Start-WebAppPool
PowerShellã³ãã³ãã䜿çšããŸãã
ããŒã«ã«éçºã®å ŽåãWebDeployã¯æ©èœããŸããã§ããã ããŒã«ã«IISã«å¯ŸããŠäœ¿çšããããšããŸãããããã¡ã€ã«ãããã¯ãããŠãããšæå¥ãèšããŸãã 次ã«ãVS Pre / Postãã«ãã€ãã³ãããäžèšã®PowerShellã³ãã³ãã¬ããã䜿çšããŠã¿ãŸãããããããã32ãããã®PowerShellã64ãããã®IISèšå®ãå€æŽã§ããªãããããããæ©èœããŸããã§ãããïŒ ãšã«ãããããŸãæ©èœããŠããããã«èŠããã®ã¯ãASP.NetCoreãããžã§ã¯ãã®æ¬¡ã®ãã«ãååŸã®ã€ãã³ãã§ãã
ãã«ãåã®ã€ãã³ãïŒ
echo "App Offline" /a > $(ProjectDir)app_offline.htm
ãã«ãåŸã®ã€ãã³ãïŒ
del $(ProjectDir)app_offline.htm
ç§ã¯ããã§äžå¹³ãç°¡åã«çèªããŸããããããŠããã¯é¢é£ããŠããããã§ãã CIãããã€ã¡ã³ãããäžè¬çã«ãæ©èœãããã¿ã³ã®ãããã€ãããiis管çã¿ã¹ã¯ã§azure devopsãªãªãŒã¹ã䜿çšããããã«ç§»åããŸããããwebappãåæ¢ããåŸãã¢ããªãã¡ã€ã³ãåæ¢ããåŸã§ãããã¡ã€ã«ããŸã æ®ã£ãŠãããããæ°ãããã¡ã€ã«ã®ãããã€ã§åé¡ãçºçããããšããããããŸãã䜿çšããã
ããã¯ããããããããã€ã®3åã®1ã«å°ãªããšã1ã€ãããç¶æ³ãæ¹åãããããããã€ã®ä¿¡é Œæ§ãé«ããããããããªãã®ã¯äœãèŠã€ãããŸããã§ããã
@ Tratcher @ ronnyekããã¯ApplicationInsightsã«é¢é£ããŠããããã§ãã App Insightsæ¡åŒµæ©èœãè¿œå ããåŸãç§ã®Webã¢ããªDLLãçªç¶æŽæ°ããã®ãéåžžã«é£ãããªãããããŸã§ã¯åé¡ã¯ãããŸããã§ããã
App Insightsããããã¡ã€ã©ãŒãã¢ããªããã»ã¹ãšDLLã«æ¥ç¶ããå¿ èŠãããããšãèãããšãããã¯çã«ããªã£ãŠããŸãã
ç§ã¯ãŸã ãã®åé¡ã«çŽé¢ããŠããŸãã ãã©ã°-enableRuleïŒAppOfflineã䜿çšããŸã
ãªãªãŒã¹ãéå§ããåŸãWebã¢ããªã±ãŒã·ã§ã³ãã©ã«ããŒãç£èŠããmsdeployã«ãã£ãŠãããããããApp_Offline.htmlã確èªããŸãã 次ã«ãäžèšã®ã¡ãã»ãŒãžã§ãªãªãŒã¹ã倱æããApp_Offlineãã¡ã€ã«ããŸã ãã©ã«ããŒã«ããããšã«æ³šæããŠãã ããããªãªãŒã¹ãåéããŸããä»åã¯ãã¢ãžã¥ãŒã«ããã©ã«ããŒå ã®ãã¡ã€ã«ã確èªã§ãããããæ£åžžã«æ©èœããŠããŸãã
æåŸã«ã€ã³ã¹ããŒã«ãããasp.netã³ã¢ã©ã³ã¿ã€ã -> aspnetcore.dll 12.1.18263.2
äœãæ¡ã¯ ïŒ ãŸã ãã°ïŒ
@dhtek app_offline.htm
é
眮ããçŽåŸã«ãã¡ã€ã«ã眮ãæããããšãããšããµãŒããŒã«ã¯ã¢ããªã±ãŒã·ã§ã³ãã·ã£ããããŠã³ããã®ã«ååãªæéããããŸããã§ããã ãã¡ã€ã«ã®çœ®ãæããè©Šã¿ãåã«ãå°ãåŸ
ã€å¿
èŠããããŸãã
ããããŸãããã msdeployã®-e
ç§ããŸã ãã®åé¡ãæ±ããŠããŸãã ç§ã®ãããžã§ã¯ããã¡ã€ã«ã¯Microsoft.NET.Sdk.Web
åç
§ããŠããŸãããããã¥ã¡ã³ãã«èšèŒãããŠããããã«ã app_offline.htm
ãã¡ã€ã«ãèªåçã«åé€ããŠããŸããã
ããã«ã¡ã¯ãã¿ããªã ãã®åä»ãªåé¡ã¯ãææ°ã®VS2017ãæèŒããCore2.1ã§ãåŒãç¶ãçºçããŸããappofflineã䜿çšããŠããŸãããã¡ã€ã³ãããžã§ã¯ãã®dllã¯åžžã«äœ¿çšãããŠãããå ¬éäžã«Webãµã€ããå®å šã«åæ¢ããå¿ èŠããããŸãã ããã«ãããWebãããã€ã¯ã»ãšãã©åœ¹ã«ç«ããªããªããŸãã
ããŒããã©ã³ãµãŒã®èåŸã§ãã¹ãããªãã©ã€ã³ã«ããããšãã§ãããããè¿
éã«å®è¡ãããå Žåã¯ãã·ã³ããªãã¯ãªã³ã¯ãšããã€ãã®PowerShellã䜿çšãã1ã€ã®æ¹æ³ããããŸãã
ãããªããšãèããŠããŸããã
ã³ããŒ+ãªãµã€ã¯ã«äžã«ã¢ããªããŒã«ãåæ¢ããå¿ èŠããªããããçŸåšã®ãªã¯ãšã¹ããå®äºã§ãããããããŠã³ã¿ã€ã ãå°ãªããªããããããŒãã¹ããããããé«éã§ãã
# Setup
Import-Module WebAdministration
# create 2 site root directories
$a = 'C:\inetpub\AspNetCoreSampleA'
$b = 'C:\inetpub\AspNetCoreSampleB'
$siteRoot = 'C:\inetpub\aspnetcoresample'
$siteName = 'AspNetCoreSample'
$poolName = "aspnetcore"
New-Item -Type Directory $a
New-Item -Type Directory $b
# create a symlink to targeting one side
New-Item -Type SymbolicLink -Path $siteRoot -Target $a
# point the site root to the symlink
Set-ItemProperty "IIS:\Sites\$siteName" -name physicalPath -value $siteRoot
# make sure it get's picked up
Restart-WebAppPool -Name $poolName
# this tells you the active side
Get-Item -Path $siteRoot | Select-Object -ExpandProperty target
# Flip the symlink
$current = (Get-Item -Path $siteRoot).Target
$newTarget = if ($current -eq $a) {$b} else {$a}
New-Item -Type SymbolicLink -Path $siteRoot -Target $newTarget -Force
# at this point w3wp.exe still locks the current target folder until it's getting recycled
# Deploy new version to the symlink which is now pointing to the other side which should have no locks
robocopy \\myshare\myapp $siteRoot /mir
# recycle app pool, so it picks up the new files
Restart-WebAppPool -Name $poolName
# bonus point: rollback is easy
$current = (Get-Item -Path $siteRoot).Target
$newTarget = if ($current -eq $a) {$b} else {$a}
New-Item -Type SymbolicLink -Path $siteRoot -Target $newTarget -Force
Restart-WebAppPool -Name $poolName
ããã«èŠç¹ããããŸã
https://gist.github.com/csharmath/b2af0f50700ce9fbdd8c5c3e582fd41b
åèµ·å-WebAppPoolã¯åºæ¬çã«ãªãµã€ã¯ã«ã§ããããã¯ãéè€ãããªãµã€ã¯ã«ãæå¹ã«ããŠããå ŽåïŒããã©ã«ãïŒã«äŸ¿å©ã§ããæ°ããw3wp.exeãçæãããçŸåšå®è¡äžã®ãªã¯ãšã¹ããå®äºãããŸã§ããã¹ãŠã®æ°ãããªã¯ãšã¹ãããã®æ°ããããã»ã¹ã«ãã£ãŠåŠçãããŸããå€ãw3wp.exeã«ãã£ãŠã
ãã®ããã«ãå€ããªã¯ãšã¹ããå®äºãããŸã§ãããã¯éè€ããæ°ããããŒãžã§ã³ãæãåäžã®w3wp.exeãäœæãããããã¯ã®åé¡ã¯çºçããŸããã
ããã¯ã·ã£ããŠã³ããŒã«äŒŒãŠããŸããã100ïŒ ã§ã¯ãªããã¯ããã«åªããã·ãŒã ã¬ã¹ãªxcopyã·ããªãªãæäŸããŸãã
ãããŸã§ã®ãšããããªãªãŒã¹äžã«ãªã³ã©ã€ã³ãç¶æããå¿ èŠãããå Žåã¯ãç§ãèããããšãã§ããæåã®ã¢ãããŒãã®ããã§ãã
@csharmathãŸãã¯ç§ãæšæž¬ãã
ãã¡ãããããã¯ããã«è¯ãããšã§ãã ããæ¯ããŸã ãã¹ãŠã®å Žæã«ãããããããã§ã¯ãããŸããã
æ®ãã®ãªãŒã«ãã¹ã¯ãŒã«ã®ã»ããã¢ããã§ã¯ãããŠã³ã¿ã€ã ãçºçããªããæå°éã«æãããããŸã§ããããyakshaveããå¿
èŠããããŸãã
@csharmathåæããŸããããçŸæç¹ã§ã¯ãããã_years_ã®æªä¿®æ£ã®åé¡ã§ãã£ãããšãèãããšãå¥è·¡ãåŸ ã€ã®ã§ã¯ãªããããŸãæ©èœãã解決çãæ¡çšããŠè¿œæ±ããããšãã§ããŸã...
以äžã®PowerShellã¹ã¯ãªããã䜿çšããŸããããIISãã¯ã©ãã·ã¥ããä»ã®ã¢ããªã±ãŒã·ã§ã³ããŒã«ã«ã圱é¿ãããããã¹ãŠãå ã«æ»ãã«ã¯ãã·ã³ãåèµ·åããå¿ èŠããããŸã...ãã®ããã»ã¹ã¯å ¬åŒããã¥ã¡ã³ãããååŸãããã®ã§ãçœå®³ã§ãããç§ã®ã¢ããã€ã¹ã¯ããã®ã¹ã¬ããhttps://github.com/IsraelHikingMap/Site/blob/master/Scripts/Deployã§èŠã€ãããã¢ããªããŒã«ãåæ¢ããŠåéããã¹ã¯ãªããã䜿çšããããã«app_offline.htmã䜿çšããªãããšã§ã
$pathToApp = 'G:\prod_web_core'
$pathToAppOfflineHtml = 'G:\prod_web_core\app_offline.htm'
# Stop the AppPool
New-Item -Path $pathToApp -Name app_offline.htm
# Provide script commands here to deploy the app
Copy-Item "G:\prod_web_core_temp\*" -Destination $pathToApp -Recurse -Force
# Restart the AppPool
Remove-Item -Path $pathToAppOfflineHtml
Get-ChildItem -Path "G:\prod_web_core_temp" -Recurse | Remove-Item -Force
ãããã€ãæåãããããã«AppPoolã匷å¶çã«åæ¢ããŸããããã®åé¡ãä¿®æ£ããããã®é²æç¶æ³ã¯ãããŸããïŒïŒ
dotnet coreã¯ç§ãã¡ã«ãšã£ãŠæ°ããã®ã§ãä»æ¥åããŠãã®ãã¡ã€ã«ããã¯ã®åé¡ã«ééããŸããã ç§ã¯ããã«æ¬åœã«æ°ã倱ããŸããã ãŸã ããŒã¿çïŒã2001ïŒã®ãšãã«ClassicASPãã.NetFrameworkã«åãæ¿ããæ倧ã®çç±ã¯ããã¡ã€ã«ãããã¯ããã«ããããããã€ã¡ã³ããå®è¡ã§ããããã§ãã ããã¯ãããã£ãïŒ ã»ãŒ18幎åŸãä»ãç§ã¯å§ãããšããã«æ»ã£ãŠããŸãã ãŸããããªãã¯ããã€ããåã¡åããããã€ãã倱ããŸãã
ç§ã¯èªåã®åé¡ãåç
§ããŸãã...ç§ã®å Žåã¯BlazorãµãŒããŒãµã€ããœãªã¥ãŒã·ã§ã³ãå±éããŠããŸã...
æ°æ¥åã¯æªå€¢ã§ãã... app_offline.htmãé©çšããã¢ããªããŒã«ãã·ã£ããããŠã³ããIISã€ã³ã¹ã¿ã³ã¹å
šäœãåèµ·åããŠãã¡ã€ã«ã®ããã¯ã解é€ããŸããã 次ã®ã¹ãããã¯ããµãŒããŒå
šäœãåèµ·åããããšã§ããã幞ãã5ååŸã«.dllãããã¯è§£é€ãããŸããã
2019ãç§ã«ãšã£ãŠåãåé¡...ãããŠãã®åé¡ã¯2016幎ã«äœæãããŸãã...ãŸã 解決çã¯ãããŸãããïŒ
2020幎ãç§ã«ãšã£ãŠãåãåé¡ã å²äžæ倧ã®ååž°ã .Net 4.6 dllãã¡ã€ã«ã眮ãæãããšãã¢ããªã¯æ°ããããŒãžã§ã³ã§ãªããŒããããŸãã .NetCoreã¯ãã¹ãŠãããã¯ããŸãã
@bladefistä»æ¥ã®æåã®çã¯ãDockerã³ã³ããã䜿çšããããšã§ãïŒ/
@kanadajã«æè¬ããŸãããDockersã¯å¯ŸåŠãã¹ãé çã®çš®ã®ãã1ã€ã®å±€ã§ãã æçµçã«ãApp_offline.htmã䜿çšããŠã1ååŸ ã£ãŠããããã¡ã€ã«ãç¡æã«ãªãããšãæåŸ ããåé¿çãèŠã€ããŸããã 99ïŒ ã®ç¢ºçã§ãåŸ ã€å¿ èŠããããŸããç§ã®ã¢ããªã®é»æºãåãããŸã§ãã°ããæéãããããšæããŸãã
.net 4.6ã®æ代ã¯çµãããdllãã³ããŒããŠãã¢ããªãèªåãªãµã€ã¯ã«ããŸããã åçŽããããšæããŸãã äºéã«èç«ãããã®ã¯ããããLinuxã®åé¡ã§ã¯ãªããšããããšã§ãã Linuxã§äœ¿çšäžã®ãã¡ã€ã«ã眮ãæããããšãã§ããŸãã
ããã§ãããç§ã¯æšæž¬ããŸããããã®æ¹æ³ã¯å®çšŒåç°å¢ã§ã¯ããã»ã©åçŽã§ã¯ãããŸããã HAããªããšãã¢ããªã¯1åéå¿çããªããªããHAã䜿çšãããšãããŒããã©ã³ãµãŒãã¢ããªãããŠã³ããŠãããšå€æãããŸã§ãã©ã³ãã ã«äžæ£ãªãªã¯ãšã¹ããçºçããŸã...ããŒããã©ã³ãµãŒã§ãã¹ããæåã§åŸªç°ãããªãéãã ããããããã¯ã»ããã¢ãããããã«é¢åãªããã«æããŸãã
@kanadajãããããŒããã©ã³ãµãŒã䜿çšãããšããµãŒããŒãç·åœ¢ã«æŽæ°ãããŸãã ããŠã³ã¿ã€ã ã¯ãããŸããã
ç§ãã¡ã¯æåããŸãã
appcmd
ãŠãŒãã£ãªãã£ã䜿çšããŠã¢ããªããŒã«ãåèµ·åããŸãã@davidglassborowããã¯åµé çãªè§£æ±ºçã§ãã ããããšãã ãã ããã¯ãªãšã€ãã£ããªãœãªã¥ãŒã·ã§ã³ã¯å¿ èŠãããŸããã
ç§ã®çµéšã§ã¯ããµã€ãã«è² è·ãããã£ãŠãããšãã¯å€ãã¡ã«ããºã ã®ä¿¡é Œæ§ãäœãããã©ãã£ãã¯ã®å€ããµã€ãã«ã¯ãšã«ãããªããŒã¹ãããã·ãé 眮ããããšã«ãªããŸããã
確ãã«ãã€ã³ãã¬ãŒã¹å±éã¯ä¿¡é Œæ§ãé«ããã¢ãããã¯ã§ã¯ãããŸããã§ããããéãè¯ãã£ãå Žåããã©ãã£ãã¯ãå°ãªãã£ãå Žåã¯åé¡ãããŸããã èŠæ ã®å€§éšåã¯ãããã®ã·ããªãªã«é¢é£ããŠãããšæããŸãã .NET5.0ã®æéæ ã§ç©äºãæ¹åããããšãæ€èšããŸãã ããã€ãã®èŠåïŒ
@ davidfowl5.0ã«ã€ããŠæŠèª¬ããèšç»ã¯çŽ æŽãããã§ããã ã»ãšãã©ã®å Žåããã¬ãŒã ã¯ãŒã¯ã«äŸåãããã®ã䜿çšããŸãã
ã€ã³ãã¬ãŒã¹å±éã®ä¿¡é Œæ§ã«ã€ããŠã¯ãæ¬æãè¡šããŠæèŠãåãããŠããŸãã ç§ã¯éåžžã«è² è·ã®é«ããµã€ãã§äœå¹Žããããè¡ã£ãŠããŸããããäžåºŠãåé¡ã¯ãããŸããã§ããã æåã«æ€åºãããå€æŽã«ããã¢ããªããªã»ãããããããŒããã©ã³ãµãŒã¯ã€ã³ã¹ã¿ã³ã¹ãå¿çããŠããªãããšã確èªããŠãªãã©ã€ã³ã«ããŸãããã¹ãŠã®DLLã眮ãæãããããšãããŒããã©ã³ãµãŒã¯ãã«ã¹ãã§ãã¯ãå®äºããŠãªã³ã©ã€ã³ã«æ»ããŸãã ããŒããã©ã³ãµãŒã®ãã«ã¹ãã§ãã¯ããªãã£ãå Žåãããã¯ã®ã£ã³ãã«ã§ãããããçš®ã®ãããã·ã䜿çšããŠé«è² è·ã§æ¬çªç°å¢ã®DLLã眮ãæããã®ã¯èª°ã§ããïŒ äŸå€ã§ã¯ãªããã«ãŒã«ã«çŠç¹ãåœãŠãŸãããã ãããã·ããªããšãåæ¢ãåŒãèµ·ãããã«ã¢ããªãæŽæ°ããæ¹æ³ã¯èããããŸããã ããããªããŒãããµããŒãããŠããå Žåã§ããäžéšã®ãªã¯ãšã¹ãã¯ãã³ã°ãŸãã¯å€±æããå¯èœæ§ããããŸãã
ã€ã³ãã¬ãŒã¹å±éã®ä¿¡é Œæ§ã«ã€ããŠã¯ãæ¬æãè¡šããŠæèŠãåãããŠããŸãã ç§ã¯éåžžã«è² è·ã®é«ããµã€ãã§äœå¹Žããããè¡ã£ãŠããŸããããäžåºŠãåé¡ã¯ãããŸããã§ããã æåã«æ€åºãããå€æŽã«ããã¢ããªããªã»ãããããããŒããã©ã³ãµãŒã¯ã€ã³ã¹ã¿ã³ã¹ãå¿çããŠããªãããšã確èªããŠãªãã©ã€ã³ã«ããŸãããã¹ãŠã®DLLã眮ãæãããããšãããŒããã©ã³ãµãŒã¯ãã«ã¹ãã§ãã¯ãå®äºããŠãªã³ã©ã€ã³ã«æ»ããŸãã ããŒããã©ã³ãµãŒã®ãã«ã¹ãã§ãã¯ããªãã£ãå Žåãããã¯ã®ã£ã³ãã«ã§ãããããçš®ã®ãããã·ã䜿çšããŠé«è² è·ã§æ¬çªç°å¢ã®DLLã眮ãæããã®ã¯èª°ã§ããïŒ äŸå€ã§ã¯ãªããã«ãŒã«ã«çŠç¹ãåœãŠãŸãããã ãããã·ããªããšãåæ¢ãåŒãèµ·ãããã«ã¢ããªãæŽæ°ããæ¹æ³ã¯èããããŸããã ããããªããŒãããµããŒãããŠããå Žåã§ããäžéšã®ãªã¯ãšã¹ãã¯ãã³ã°ãŸãã¯å€±æããå¯èœæ§ããããŸãã
ããŒããã©ã³ãµãŒããããŸãã å€ãã®äººã¯ããŒããã©ã³ãµãŒãæã£ãŠãããããã£ã¹ã¯äžã®ãã¡ã€ã«ãæå®ã®å Žæã§çœ®ãæããŠãããéæ³ãæåŸ ããŠããŸãð
@davidfowlæ£ãããããã©ãã£ãã¯ãå€ã+ãã³ããªã=ç¡è¬
ãŸããapp_offline.htmã®åé¡ã¯ãci / cdããã»ã¹ãããããã»ã¹ããã€åæ¢ãããããããªãããšã§ãã ã·ã£ããããŠã³ããã»ã¹ã«ã¯1ç§ãã1åãããå¯èœæ§ãããããããã®ãã¡ã€ã«ã®äœæãšDLLã®ããã·ã¥ã®éã«å·šå€§ãªã¹ãªãŒãã³ãã³ããè¿œå ããå¿ èŠããããŸããã 倧éã®ã€ã³ã¹ã¿ã³ã¹ãè² è·åæ£ããŠããå Žåããããã®ã¹ãªãŒãã¯éåžžã«é·ããããã€ãµã€ã¯ã«ã«ãªããŸãã
ãã ãããã¡ã€ã«ãã¡ã¢ãªã«ããŒããããšããã¹ãŠä¿®æ£ãããŸãã
@davidfowlæ£ãããããã©ãã£ãã¯ãå€ã+ãã³ããªã=ç¡è¬
ð
ãŸããapp_offline.htmã®åé¡ã¯ãci / cdããã»ã¹ãããããã»ã¹ããã€åæ¢ãããããããªãããšã§ãã ã·ã£ããããŠã³ããã»ã¹ã«ã¯1ç§ãã1åãããå¯èœæ§ãããããããã®ãã¡ã€ã«ã®äœæãšDLLã®ããã·ã¥ã®éã«å·šå€§ãªã¹ãªãŒãã³ãã³ããè¿œå ããå¿ èŠããããŸããã 倧éã®ã€ã³ã¹ã¿ã³ã¹ãè² è·åæ£ããŠããå Žåããããã®ã¹ãªãŒãã¯éåžžã«é·ããããã€ãµã€ã¯ã«ã«ãªããŸãã
ããã§ããåé¡ã¯ããã®ãã¡ã€ã«ãåé€ããŠããANCMãéç¥ãåä¿¡ãããŸã§ãã¡ã€ã«ãããã¯ããããŸãŸã§ãããããå±éãéå§ããŠããããã©ãããããããªãããšã§ãã
ãŸããapp_offline.htmã®åé¡ã¯ãci / cdããã»ã¹ãããããã»ã¹ããã€åæ¢ãããããããªãããšã§ãã
ããã§ããVSãããªãã·ã£ãŒã¯çãã¹ãªãŒããšæ°åã®åè©Šè¡ã䜿çšããŸãã
- ã¢ããªã±ãŒã·ã§ã³ããªãµã€ã¯ã«ããã«ã¯ãappofflineãã¡ã€ã«ãè¿œå ããã³åé€ããå¿ èŠããããŸãã appofflineãã¡ã€ã«ãè¿œå ããããšã¯ããããã€ã¡ã³ãã®çµæãšããŠã¢ããªã±ãŒã·ã§ã³ãåèµ·åããããšãéç¥ããæ¹æ³ã§ãã
åŸã§appofflineãã¡ã€ã«ãåé€ããã«ãã¢ããªããªãµã€ã¯ã«ããããã«ããŒã¯ãããapprestartããã¡ã€ã«ãäœæããããšã¯å¯èœã§ããããã
@Socolinããã¯ãªãã§ããïŒ
@Socolinããã¯ãªãã§ããïŒ
ç§ãããç解ããŠããå ŽåïŒééã£ãŠããå Žåã¯æããŠãã ããïŒãããã¯ã解é€ããäºå®ã§ããããã«ãã®å®äºåŸã«ã¢ããªããªãµã€ã¯ã«ããããã«IISã«éç¥ããappofflineãäœæããå¿ èŠããããŸããïŒ
ãããè¡ãã«ã¯ããã¡ã€ã«appofflineãäœæããŠãããåé€ããå¿ èŠããããŸãã ãã®ãã¡ã€ã«ã¯ããã¡ã€ã«ãäœæãããçŽåŸã«åé€ã§ããŸããïŒ ãŸãã¯ãIISããããæ€åºããã®ãåŸ ã€å¿ èŠããããŸããïŒ å°ãåŸ ã€å¿ èŠãããå Žåã¯ãIISããªãã¹ã³ãããapprestartãã®ãããªãã¡ã€ã«ãçšæãããããæ€åºãããåé€ããŠãªãµã€ã¯ã«ãéå§ããŸãã
ãŸããå¥ã®è³ªåããããŸãã ãã«ãäžã®IDEã®æé©åã«ã€ããŠã§ãã
çŸåšãç§ã¯äŸåé¢ä¿ã䜿çšãããããžã§ã¯ãã«åãçµãã§ããŸããWebã¬ã€ã€ãŒçšã®ãããžã§ã¯ããšãããžãã¯ãšããŒã¿çšã®ä»ã®ãããžã§ã¯ãããããŸãã ãã«ãäžã«Webã¬ã€ã€ãŒïŒASP.NET CoreïŒã§äœæ¥ããå Žåããã«ãåã«appofflineãã¡ã€ã«ãäœæãããã«ãåŸã«åé€ãããšæ©èœããŸãã
ããããäŸåé¢ä¿ã®1ã€ã§äœæ¥ãããšããRiderãããã«ããããšãïŒmsbuildã䜿çšããŠããã®ã§VSã§ãåãããšãããŠãããšæããŸãïŒãmsbuildãäœãããŠããã®ããèŠããšããããžã§ã¯ãã®ãã«ããå®äºãããšã dllã¯ã.Webãããžã§ã¯ããåæ§ç¯ããã«ã.Web / binãã£ã¬ã¯ããªã«çŽæ¥ã³ããŒãããŸãã ãŸããdllãããã¯ãããŠããããããµã€ã¬ã³ãã«å€±æãããµãŒããŒãæåã§åèµ·åãããã.Webãããžã§ã¯ãã®ãã«ããæåã§ããªã¬ãŒããå¿ èŠããããŸãã
ããã«å¯Ÿãã解決çã¯ãããŸããïŒ
ãããŸã§ã®ãšãããç§ãèŠã€ããåé¿çã¯ãããã¯ã°ã©ãŠã³ãã§å®è¡ãããŠããå°ããªããã°ã©ã ãäœæããŠã.Webãããžã§ã¯ãã®/ binãæ¢ãããšã§ãã ãã¡ã€ã«ãå€æŽããããšãIISããªãã¹ã³ãããã£ã¬ã¯ããªã«appofflineãã¡ã€ã«ãäœæãããå€æŽããããã¡ã€ã«ãã³ããŒãããŠãããappofflineãåé€ãããŸãã ããããå°ãããããŒãªæããããŸããããããŸã§ã®ãšããããã«ãã§ããããšãããã£ãå¯äžã®æ¹æ³ã§ãã次ã«F5ããŒãæŒããŠãå€æŽããã¹ãããŸãã
ãããè¡ãã«ã¯ããã¡ã€ã«appofflineãäœæããŠãããåé€ããå¿ èŠããããŸãã ãã®ãã¡ã€ã«ã¯ããã¡ã€ã«ãäœæãããçŽåŸã«åé€ã§ããŸããïŒ ãŸãã¯ãIISããããæ€åºããã®ãåŸ ã€å¿ èŠããããŸããïŒ å°ãåŸ ã€å¿ èŠãããå Žåã¯ãIISããªãã¹ã³ãããapprestartãã®ãããªãã¡ã€ã«ãçšæãããããæ€åºãããåé€ããŠãªãµã€ã¯ã«ãéå§ããŸãã
ãã¡ã€ã«ã®ã³ããŒãå®äºããããšãIISã¯ã©ã®ããã«ç¥ãã®ã§ããããã åŒãè£ãããç¶æ ãã©ã®ããã«åé¿ããŸããïŒ åºæ¬çã«ããã©ã³ã¶ã¯ã·ã§ã³ã®éå§ãšå®äºãéç¥ããå¿ èŠããããŸãã ãã¡ã€ã«ã®äœæã¯éå§ã瀺ããåé€ã¯çµäºã瀺ããŸãã
ããã«å¯Ÿãã解決çã¯ãããŸããïŒ
ãããŸã§ã®ãšãããç§ãèŠã€ããåé¿çã¯ãããã¯ã°ã©ãŠã³ãã§å®è¡ãããŠããå°ããªããã°ã©ã ãäœæããŠã.Webãããžã§ã¯ãã®/ binãæ¢ãããšã§ãã ãã¡ã€ã«ãå€æŽããããšãIISããªãã¹ã³ãããã£ã¬ã¯ããªã«appofflineãã¡ã€ã«ãäœæãããå€æŽããããã¡ã€ã«ãã³ããŒãããŠãããappofflineãåé€ãããŸãã ããããå°ãããããŒãªæããããŸããããããŸã§ã®ãšããããã«ãã§ããããšãããã£ãå¯äžã®æ¹æ³ã§ãã次ã«F5ããŒãæŒããŠãå€æŽããã¹ãããŸãã
VSã¯ããã®ãããžã§ã¯ãã®æ§ç¯ã«åœ±é¿ãäžããå¯èœæ§ã®ãããã®ã«ã€ããŠãæ°ãããã¡ã€ã«ãéå§ããåã«ããã»ã¹ã匷å¶çµäºããããšã§ãããåŠçããŸãã
ãããè¡ãã«ã¯ããã¡ã€ã«appofflineãäœæããŠãããåé€ããå¿ èŠããããŸãã ãã®ãã¡ã€ã«ã¯ããã¡ã€ã«ãäœæãããçŽåŸã«åé€ã§ããŸããïŒ ãŸãã¯ãIISããããæ€åºããã®ãåŸ ã€å¿ èŠããããŸããïŒ å°ãåŸ ã€å¿ èŠãããå Žåã¯ãIISããªãã¹ã³ãããapprestartãã®ãããªãã¡ã€ã«ãçšæãããããæ€åºãããåé€ããŠãªãµã€ã¯ã«ãéå§ããŸãã
ãã¡ã€ã«ã®ã³ããŒãå®äºããããšãIISã¯ã©ã®ããã«ç¥ãã®ã§ããããã åŒãè£ãããç¶æ ãã©ã®ããã«åé¿ããŸããïŒ åºæ¬çã«ããã©ã³ã¶ã¯ã·ã§ã³ã®éå§ãšå®äºãéç¥ããå¿ èŠããããŸãã ãã¡ã€ã«ã®äœæã¯éå§ã瀺ããåé€ã¯çµäºã瀺ããŸãã
ããã¯ããªãå Žåããã«ãã®éå§æã«IISã«éç¥ããã®ã¯ãªãã§ããïŒ ãã¹ãŠã®ãã¡ã€ã«ãæŽæ°ãããã¢ããªã±ãŒã·ã§ã³ããªãµã€ã¯ã«ããå¿ èŠãããå Žåã«éç¥ããããšã¯ã§ããŸãããïŒ ç§ã¯äœãã誀解ãããšæããŸãã
ããã¯ããªãå Žåããã«ãã®éå§æã«IISã«éç¥ããã®ã¯ãªãã§ããïŒ ãã¹ãŠã®ãã¡ã€ã«ãæŽæ°ãããã¢ããªã±ãŒã·ã§ã³ããªãµã€ã¯ã«ããå¿ èŠãããå Žåã«éç¥ããããšã¯ã§ããŸãããïŒ ç§ã¯äœãã誀解ãããšæããŸãã
ã¯ããããã¯ããŸãããã§ãããã ããªãã¯çŸåšã®æå 端æè¡ã説æããŠãããšæããŸããã ä»æ¥ãweb.configã䜿çšããŠãããè¡ãããšããå¯èœãããããŸããã ãã¡ã€ã«ã«è§Šãããšãã¢ããªã±ãŒã·ã§ã³ãåèµ·åããŸãã
ã€ã³ãã¬ãŒã¹å±éïŒhttps://flukefan.github.io/ZipDeploy/ïŒã§æåããŸããã
è² è·åæ£ãªãã åäžã®IISã€ã³ã¹ã¿ã³ã¹ã IISã®å€æŽã¯ãããŸããã YMMVã
@FlukeFanå±éã®
ãã¹ãŠã®ã¢ã»ã³ããªã®ååãå€æŽ/æŽæ°ããããŸã§ãweb.configã«ã¯è§ŠããŸããã ãã®éã«äœãä»ã®ãã®ãã¢ããªããŒã«ããªãµã€ã¯ã«ããå¯èœæ§ã¯ãããã«ãããšæããŸãããããã¯ãŸã èµ·ãã£ãŠããŸããã
ç§ã¯éåžžãä»ã®ãã¹ãŠã®èªåãªãµã€ã¯ã«ãªãã·ã§ã³ããªãã«ããIISã¢ããªããŒã«èšå®ã§éè€ãªãµã€ã¯ã«ãç¡å¹ã«ããŸãã
@FlukeFanã¯ãªãµã€ã¯ã«ã§ã¯ãããŸãããã亀æãããã¢ã»ã³ããªããŸã ããŒãããŠããªãå Žåã ããšãã°ãã¢ã»ã³ããªA.dllãšB.dllããããšããŸãã èšå®ããŒãžã«ç§»åãããšBã䜿çšãããã®ã§ãããŒãããããšããŸãã B.dllãæ°ãããã®ã«çœ®ãæãããããšãã«èšå®ããŒãžã«ç§»åãããšãå€ãã¢ããªãæ°ããB.dllã§å®è¡ãããå¯èœæ§ããããŸãã
ãã®ã¿ã€ãã®å±éãæ¯æŽããããã«ãdotnetã°ããŒãã«ããŒã«ãäœæããå¿ èŠãããã®ã§ã¯ãªãããšæããŸãã ãã®ããŒã«ã¯åºæ¬çã«ããã®ã¹ã¬ããã§äººã ãèšåãããã¹ãŠã®é£ããããšãå®è¡ã§ããŸãã
èãïŒ
@FlukeFanã¯ãªãµã€ã¯ã«ã§ã¯ãããŸãããã亀æãããã¢ã»ã³ããªããŸã ããŒãããŠããªãå Žåã ããšãã°ãã¢ã»ã³ããªA.dllãšB.dllããããšããŸãã èšå®ããŒãžã«ç§»åãããšBã䜿çšãããã®ã§ãããŒãããããšããŸãã B.dllãæ°ãããã®ã«çœ®ãæãããããšãã«èšå®ããŒãžã«ç§»åãããšãå€ãã¢ããªãæ°ããB.dllã§å®è¡ãããå¯èœæ§ããããŸãã
ã ããç§ã¯ä»ãã®ã±ãŒã¹ãåŠçããŠããŸããã https://github.com/FlukeFan/ZipDeploy/blob/master/ZipDeploy/ZipDeploy.cs#L55
ç§ã¯å¥ã®é åºã§ç©äºãè¡ãããšãã§ãããšæããŸããæåã«web.configã«ã¿ãããããã¹ãŠã®ããã®ä»ãã®ãªã¯ãšã¹ããçµäºããã®ãåŸ ã£ãŠãããæåŸã®ãªã¯ãšã¹ããçµäºããçŽåã«æåŸã«çœ®æãå®è¡ããŸãïŒIISãæ°ãããªã¯ãšã¹ãããã¥ãŒã«å ¥ããŠããéïŒ recycle app-poolïŒã§ãããç§ãæã£ãŠãããã®ã¯ä»ç§ã®ããã«åããŠããŸãã
ããããçŸåšãããªãã説æããŠããã·ããªãªã«å¯ŸããŠååã«å ç¢ã§ã¯ãããŸããïŒãã ããèµ·åæ以å€ã¯ãåçãªã¢ã»ã³ããªã®èªã¿èŸŒã¿ã«ã€ããŠã¯äœãããŠããŸããïŒã
ãã®æ©èœãåæ€èšããŠããŒããããã«èŒããäºå®ã¯ãããŸããïŒ ããŠã³ã¿ã€ã ãŒãã®å±éããµããŒããããå Žåã.Net Core Webãµã€ããå±éãããã¹ãŠã®äººã«ãã¹ããŒãžã³ã°ã¹ãããæŠç¥ãæåã§å®è£ ããããã«èŠæ±ããããšã¯éåžžã«äžäŸ¿ã§äžäŸ¿ã§ãã
ãã®æ©èœã䜿çšãããšãå€ãã®äººã«ãšã£ãŠ.Net Core Webãµã€ããžã®ç§»è¡ãã¯ããã«ã¹ã ãŒãºã«ãªãã.Net CoreWebãµã€ããããè¿ éã«æ¡çšã§ããããã«ãªããŸãã
ç§ã¯ãããèããããšã¯ãããŸããã ããããããªãã¯é ã«éãæã£ãå¯èœæ§ããããŸãã ããã¯ã人ã ã«çŽºç¢§ã®ã¹ãããã䜿çšããããšããæªè³ªãªããžãã¹äžã®æ±ºå®ã§ããå¯èœæ§ããããŸãã éå»ã«å¯èœã ã£ããšãããããªãä»ãä¿®æ£ãããã®ã«ããã»ã©æéãããã£ãã®ã§ããããã ãããäœã念é ã«çœ®ããŠãããã¯ãããžãã¹ã®èŠ³ç¹ããã¯å£ããŠããŸããã å€åç§ã¯å°ãç®èã§ãã ãããã以åã¯ç¡æã§åãåãããããé«äŸ¡ãªå±€ã«ç§»åããŠãã玺碧ã®æ©èœããã£ãããšèŠãŠããŸããã
ãã®ã¿ã€ãã®å±éãæ¯æŽããããã«ãdotnetã°ããŒãã«ããŒã«ãäœæããå¿ èŠãããã®ã§ã¯ãªãããšæããŸãã ãã®ããŒã«ã¯åºæ¬çã«ããã®ã¹ã¬ããã§äººã ãèšåãããã¹ãŠã®é£ããããšãå®è¡ã§ããŸãã
èãïŒ
ããã¯CIãµãŒããŒã§å®è¡ããããšã§ãã ãã€ããª/ããã±ãŒãžãå®å ãµãŒããŒã«ã©ã®ããã«ããã·ã¥ããŸããïŒ
ç§ã¯ãããèããããšã¯ãããŸããã ããããããªãã¯é ã«éãæã£ãå¯èœæ§ããããŸãã ããã¯ã人ã ã«çŽºç¢§ã®ã¹ãããã䜿çšããããšããæªè³ªãªããžãã¹äžã®æ±ºå®ã§ããå¯èœæ§ããããŸãã éå»ã«å¯èœã ã£ããšãããããªãä»ãä¿®æ£ãããã®ã«ããã»ã©æéãããã£ãã®ã§ããããã ãããäœã念é ã«çœ®ããŠãããã¯ãããžãã¹ã®èŠ³ç¹ããã¯å£ããŠããŸããã å€åç§ã¯å°ãç®èã§ãã ãããã以åã¯ç¡æã§åãåãããããé«äŸ¡ãªå±€ã«ç§»åããŠãã玺碧ã®æ©èœããã£ãããšèŠãŠããŸããã
äžèšã®çç±ã«ããã調æŽãªãã®ã€ã³ãã¬ãŒã¹å±éã¯åºæ¬çã«ä¿¡é Œã§ããŸããã ãã®æ©èœã¯æŽå²çã«ä¿¡é Œæ§ãäœããASP.NET on .NET Frameworkã§å€ãã®åé¡ãåŒãèµ·ãããŠãããããã·ã£ããŠã³ããŒãå床å®è£ ããããšã¯ãããŸããã ãŸãããã¹ãŠã®.NETFrameworkããµããŒããããŠãããã¬ãŒã ã¯ãŒã¯ã«äŸåããç¹å®ã®ã¿ã€ãã®å±éã§ã®ã¿æ©èœããŸãã .NET Coreã¯ãèªå·±å®çµåã®åäžãã¡ã€ã«ããµããŒãããŠããããããµããŒããã¯ããã«å°é£ã§ãã äžèšã®ææ¡ã§ããããããã®ã±ãŒã¹ãã«ããŒããŠããŸããã
ã€ã³ãã¬ãŒã¹å±éã¯å¯èœãªéãã¢ãããã¯ã§ããå¿ èŠãããããã®åé¡ã«é¢ããå€ãã®åé¡ã¯ããã°ãšapp_offlineã®æ€åºãšãªãµã€ã¯ã«ã®ä¿¡é Œæ§ã®æ¬ åŠã«èµ·å ãããšèããŠãããããä¿®æ£ïŒããã³pdbããã¯ïŒã«å€ãã®æéãè²»ãããŸããã
Webãããã€ã¯ããããã€ããã®ãçã«ããªã£ãŠãããšæããããããŒãå ·äœåããä»æ¥ã®å¯äžã®ããŒã«ã§ããããã®ãã¯ãããžãŒã«éã蟌ããããŠããããããµãŒããŒã«ftpãããã€ããå Žåããã¡ã€ã«å ±æã«ã³ããŒããå Žåã¯åœ¹ã«ç«ã¡ãŸããïŒãã ãããã¶ã......ã ããïŒã
dotnetã°ããŒãã«ããŒã«ãããã§ã®çããããããŸããã
ããã¯CIãµãŒããŒã§å®è¡ããããšã§ãã ãã€ããª/ããã±ãŒãžãå®å ãµãŒããŒã«ã©ã®ããã«ããã·ã¥ããŸããïŒ
ç§ã¯ããã¯æããŸããã ããããFTPãšã¹ãã¬ãŒãã³ããŒããµããŒãããã§ãããã ãã以å€ã®ãã®ã¯ãããããç¬èªã®ãããã³ã«ã§ãã
ããŸãããã°ãFTPãšèšããšãã¯ãsshãä»ããftpãæå³ããŸãã ãã®ãããªããŒã«ã¯éåžžã«äŸ¡å€ããããŸãã
ããŸãããã°ãFTPãšèšããšãã¯ãsshãä»ããftpãæå³ããŸãã ãã®ãããªããŒã«ã¯éåžžã«äŸ¡å€ããããŸãã
ããããftpãæå³ããŸããã ããããç§ãã¡ã¯çã«ããªã£ãããšã¯äœã§ãããŸãã ãã¶ããã¿ãŒã²ãããã·ã³ã§å®è¡ããå¿ èŠãããã³ããŒããŒã«ã§ããããšãæåã§ãã ããã«ãããããããã©ãã«ã§ãéä¿¡ããå¿ èŠããªããªããŸãã
ãŸããIISã«å±éããããã«Windowsãã·ã³ã«SSHã§æ¥ç¶ããŠããŸããïŒ
@davidfowlãããã€ã¡ã³ãã¹ãããã®ãµããŒããè¿œå ïŒãªããã€ã³ïŒããŠãã ããã
https://github.com/dotnet/aspnetcore/issues/3719#issuecomment -473183712
https://github.com/dotnet/aspnetcore/issues/3793#issuecomment -335666414
ã¢ããªã±ãŒã·ã§ã³ã¢ã»ã³ããªããã£ã¹ã¯ããããŒãããŠãã¡ã€ã«ãããã¯ããã®ã§ã¯ãªãããã€ããšããŠã¡ã¢ãªã«ããŒãããããšãæ€èšããäºå®ã§ãã ããã¯ã»ãšãã©ã®å Žååé¡ãªãã¯ãã§ãããå Žåã«ãã£ãŠã¯ã¡ã¢ãªäœ¿çšéãå¢ããå¯èœæ§ã
ããã«ãããã§ã¯ããŠã³ã¿ã€ã ããŒãã«ããããšã¯ã§ããŸããã
ã¢ãžã¥ãŒã«ã§ãã®ãããªæ©èœã«æè³ããæ¹æ³ã¯ãããŸããã
ããŸãããã°ãFTPãšèšããšãã¯ãsshãä»ããftpãæå³ããŸãã ãã®ãããªããŒã«ã¯éåžžã«äŸ¡å€ããããŸãã
ããããftpãæå³ããŸããã ããããç§ãã¡ã¯çã«ããªã£ãããšã¯äœã§ãããŸãã ãã¶ããã¿ãŒã²ãããã·ã³ã§å®è¡ããå¿ èŠãããã³ããŒããŒã«ã§ããããšãæåã§ãã ããã«ãããããããã©ãã«ã§ãéä¿¡ããå¿ èŠããªããªããŸãã
ãŸããIISã«å±éããããã«Windowsãã·ã³ã«SSHã§æ¥ç¶ããŠããŸããïŒ
ã¯ãã CI / CDã䜿çšããLinuxã·ã¹ãã ãšWindowsã·ã¹ãã ã®äž¡æ¹ã«ãããã€ãããããWindowsããã¯ã¹ã«opensshãã€ã³ã¹ããŒã«ããæ¹ãã¯ããã«ç°¡åã§ããã
$ appPool = 'ããã©ã«ã'
Stop-WebAppPool -Name $ appPool -Passthru
...ãããã€...
Start-WebAppPool -Name $ appPool -Passthru
...ãããã€....ã
ãŸãã¯
$ appPool = 'ããã©ã«ã'
Stop-WebAppPool -Name $ appPool
whileïŒïŒGet-WebAppPoolState -Name $ appPoolïŒ.Value -ne'Stop 'ïŒ{
ã¹ãªãŒã1ïŒsecond
}
...ãããã€...
Start-WebAppPool -Name $ appPool
whileïŒïŒGet-WebAppPoolState -Name $ appPoolïŒ.Value -ne'Start 'ïŒ{
ã¹ãªãŒã1ïŒsecond
}
...ãããã€....ã
貧ãã人ã
ã®å±éã¹ããã
çŽ1幎åã«ã2ã€ã®ãµã€ãã«ãŒããã©ã«ããŒã®äœæã«ã€ããŠæçš¿ããIISãµã€ãçšã«æ§æããããã®ãã¡ã®1ã€ãžã®ã·ã³ããªãã¯ãªã³ã¯ãã€ã³ããèšå®ããŸããã
å©ç¹ã¯ãä»ã®ããåçŽãªãœãªã¥ãŒã·ã§ã³ãšæ¯èŒããŠãããŠã³ã¿ã€ã ãå°ãªãããšã§ãã
ãªãŒããŒã©ãããªãµã€ã¯ã«ãæå¹ã«ãªã£ãŠããå ŽåãããŠã³ã¿ã€ã ã¯çºçããããšã«ããæåã®ãªã¯ãšã¹ãã«å¯ŸãããŠã©ãŒã ã¢ããããã«ãã£ã®ã¿ãé©çšãããŸãã
ãããã€/ã³ããŒæäœãå®äºãããŸã§ã«Nç§ãããå Žåã¯ãã¢ããªããŒã«ãNç§éåæ¢ããå¿
èŠã¯ãããŸããã
çãããã¢ããªããªãã©ã€ã³ã§ãããããšã¯ãããŸããã
éã¢ã¯ãã£ããªãã©ã«ããŒã«ã³ããŒãããã¡ã€ã«ãããã«ãããšãã«ã·ã³ããªãã¯ãªã³ã¯ã亀æããŠãããã¢ããªããŒã«ããªãµã€ã¯ã«ããŸãã
ã¢ãããã¯ãããã€ãããŠã³ã¿ã€ã ã¯çºçãããéåžžã©ããæåã®ãªã¯ãšã¹ããé
ããªããŸãã
https://github.com/dotnet/aspnetcore/issues/3793#issuecomment -459870870
誰ãããããè©ŠããŸãããïŒ
ãã®ãããªãã®ãæ©èœããå Žåã¯ãã¯ã©ã€ã¢ã³ãåŽã®ãããã€ããŒã«ã䜿çšããŠãµãŒãã¹ã«å€ããããšãã§ããŸãã
ãã®ãããå±éã®ããã¯ããããã¡ã€ã«ã«ãåé¡ããããŸãã ã¢ããªãã¹ãã£ã³ã°ã§ã ã¢ããªããŒã«ãåæ¢ããããšããŸãããããã¡ã€ã«ã¯ããã¯ããããŸãŸã§ãã app_offline.htmãããã·ã¥ããããšããŸããããããŸããããŸããã§ããã
ãŸããapp_offline.htmãã¡ã€ã«ã®åé€ã管çãããå Žåã¯ãprogram.csã§ã¢ããªãèµ·åãããšãã«ç°¡åã«åé€ã§ããŸãã ãã®ããã«ããŠãéå§æã«ãªã³ã©ã€ã³ã«ãªãããšãããããŸãã
ç§ãçŽé¢ããŠããçŸåšã®åé¡ã¯ãdllããã³ã°ããååãå€æŽããŠãããã¡ã€ã«ãã³ããŒããŠããååãå€æŽããããã¡ã€ã«ã«å¯ŸããŠå€ãããã»ã¹ãå®è¡ãããŠããããšã§ãã ãããã£ãŠãå床ãããã€ããããšãããšããã¡ã€ã«ã®ååãå床å€æŽããå¿
èŠããããŸãã ãã¡ã€ã«åã®ä»£ããã«ãããçš®ã®æ¥ä»ã䜿çšã§ãããšæããŸãã
IISãµãŒããŒWindows2012R2ã§ã¯ããã«dotnetcore3.1.4ã䜿çšããŠããŸã
@foxjazzã¢ããªã®ããŒã«/ããã»ã¹ãåæ¢ããå Žåããã¡ã€ã«ã¯ã©ã®ããã«ããã¯ãããŸããïŒ è©³çŽ°ãæããŠããã ããŸããïŒ
@foxjazzã¢ããªã®ããŒã«/ããã»ã¹ãåæ¢ããå Žåããã¡ã€ã«ã¯ã©ã®ããã«ããã¯ãããŸããïŒ è©³çŽ°ãæããŠããã ããŸããïŒ
䜿çšæžã¿ã®dllãåé€ããããšãããšãç»åã«ã¯å¥ã®ããã»ã¹ã§äœ¿çšãããŠãããšè¡šç€ºãããŸãã
ã¢ããªããŒã«ã¯ãã°ããã®éãªãã©ã€ã³ã«ãªã£ãŠããŸãã
ã¿ã¹ã¯ãããŒãžã£ããã§ãã¯ããŠãããã»ã¹ããŸã å®è¡ãããŠãããã©ããã確èªããŸãã åæ¢ãã¿ã³ãæŒããŠããããã«çµäºããããã§ã¯ãããŸããã
ã¿ã¹ã¯ãããŒãžã£ããã§ãã¯ããŠãããã»ã¹ããŸã å®è¡ãããŠãããã©ããã確èªããŸãã åæ¢ãã¿ã³ãæŒããŠããããã«çµäºããããã§ã¯ãããŸããã
äžã®åçã¯ã¿ã¹ã¯ãããŒãžã£ãŒããã®ãã®ã§ãã ã©ã¡ããã¯ããããŸããããåé€ãããšãã¡ã€ã«ã解æŸãããŸãã ãã³ãã«ã䜿çšããŠãçµäºããpidãææ¡ã§ãããšæããŸãã å±éã®ããã«ãããã®é·ãã«è¡ãå¿ èŠããããšã¯æããŸããã§ããã ãã³ãã«ã«ãããšãw3wp.exe2ããã»ã¹ã®ãã¡ã€ã«ã®1ã€ãããã¯ãããŠããŸãã ãã®ããã®ã¢ããªããŒã«ãã·ã£ããããŠã³ãããŠããŠãã
æ¬åœã«çŽ æŽãããã®ã¯ãããã»ã¹ãåæ¢ããããã®ã«ãŒããããããšã§ãã
api \ KillDeathKill
{{
Program.KillProcessïŒïŒ
}
ããã¯ããããããªãã ãã¡ã€ã«ã¯ããã»ã¹ã«ãã£ãŠããã¯ãããŠããŸãã w3wpããã®ããã»ã¹ã§ããå Žåãæåãã匷å¶çµäºãããŠããªãããåããã¡ã€ã«ãããã¯ããŠããå¥ã®pidã§æ°ããããã»ã¹ãã¹ãã³ã¢ãããããŠããŸãã ãã®ããããã¡ã€ã«ãããã¯ããæ¢åã®ããã»ã¹ã匷å¶çµäºããæ°ãããããããããã€ããã¢ããªããªãã©ã€ã³ã§åé€ããæ°ããããã»ã¹ããªãããšã確èªããããã«ãæåã«ã¢ããªããªãã©ã€ã³ã«ããŠããããšã確èªããå¿ èŠããããŸã
ããã¯ããããããªãã ãã¡ã€ã«ã¯ããã»ã¹ã«ãã£ãŠããã¯ãããŠããŸãã w3wpããã®ããã»ã¹ã§ããå Žåãæåãã匷å¶çµäºãããŠããªãããåããã¡ã€ã«ãããã¯ããŠããå¥ã®pidã§æ°ããããã»ã¹ãã¹ãã³ã¢ãããããŠããŸãã ãã®ããããã¡ã€ã«ãããã¯ããæ¢åã®ããã»ã¹ã匷å¶çµäºããæ°ãããããããããã€ããã¢ããªããªãã©ã€ã³ã§åé€ããæ°ããããã»ã¹ããªãããšã確èªããããã«ãæåã«ã¢ããªããªãã©ã€ã³ã«ããŠããããšã確èªããå¿ èŠããããŸã
app_offline.htmãæåã«ããŠã³ããŠãããšèšããšãã ã¯ããããã§ãã getãªã¯ãšã¹ãã§ç¢ºèªã§ããã¹ããŒã¿ã¹ãã¹ããããééããªããªãã©ã€ã³ã§ãã ãŸããã¢ããªããŒã«ãæåã§åæ¢ããŸããã ããããããã»ã¹w3wpã¯ãŸã ãã¡ã€ã«ããã³ã°ãããŠããŸããã
ãã®åŸãããã»ã¹ã¯åæ¢ãããŸããã§ãã
ãã®åŸãããã»ã¹ã¯åæ¢ãããŸããã§ãã
ã§ã¯ããªãããã»ã¹ãåæ¢ããã®ã§ã¯ãªããã¢ããªããŒã«ãåæ¢ããã®ã§ããããã
ã¢ããªããŒã«ã¯ããã»ã¹ãè¡šããŠãããã¢ããªããŒã«ãåæ¢ãããšãããã»ã¹ãåæ¢ããŸãã ãã¡ã€ã«ãããã¯ããããã»ã¹ããªãå Žåããã¡ã€ã«ãããã¯ããããšã¯ã§ããªããããä»ã®çè«ã®1ã€ãããå¯èœæ§ãé«ãããã§ãã
ã¢ããªããŒã«ã¯ããã»ã¹ãè¡šããŠãããã¢ããªããŒã«ãåæ¢ãããšãããã»ã¹ãåæ¢ããŸãã ãã¡ã€ã«ãããã¯ããããã»ã¹ããªãå Žåããã¡ã€ã«ãããã¯ããããšã¯ã§ããªããããä»ã®çè«ã®1ã€ãããå¯èœæ§ãé«ãããã§ãã
ã¯ããããããšãèšã£ãã ç§ã¯ããªãããã³ãã³ã°ããŠããããã«èŠããã€ããã¯ãããŸããã ãã¹ãŠã®ããã¥ã¡ã³ãã§å®£äŒãããŠããããã«ãã¢ããªããŒã«ã®åæ¢ãæ©èœããŠããªããšèšã£ãŠããŸãã ããã»ã¹ã¯ããããšã§ã¯ãªãã90ç§åŸã§ãå®è¡ãããŠããŸãã ã¢ããªããŒã«ãåæ¢ããŠããããšãã¯ã£ãããšãããå Žåã§ãããã¡ã€ã«ã¯ããã¯ãããŠããŸãã ãã®ããã»ã¹ã«ã¯ãããŒã¿ãååŸããããã®ã·ã³ã°ã«ãã³ãå«ãŸããŠããŸãã ãããŠä»ã®ã³ã³ãããŒã©ãŒã ããã¯ããããã¡ã€ã«ã«åºã¥ããŠããã»ã¹ãã·ã£ããããŠã³ããã¹ã¯ãªããããããšäŸ¿å©ã§ãã ãã®åŸãæããããšãªãå±éã§ããŸããã ååã®å€æŽãæ©èœããå ŽåããããŸãã ãã¡ã€ã«ã®ååãå€æŽã§ããŸãã ïŒdotnet core 3.1.4ïŒãã¬ãŒããŒ
çŽ1幎åã«ã2ã€ã®ãµã€ãã«ãŒããã©ã«ããŒã®äœæã«ã€ããŠæçš¿ããIISãµã€ãçšã«æ§æããããã®ãã¡ã®1ã€ãžã®ã·ã³ããªãã¯ãªã³ã¯ãã€ã³ããèšå®ããŸããã
誰ãããããè©ŠããŸãããïŒ
ãã®ãããªãã®ãæ©èœããå Žåã¯ãã¯ã©ã€ã¢ã³ãåŽã®ãããã€ããŒã«ã䜿çšããŠãµãŒãã¹ã«å€ããããšãã§ããŸãã
@ CJHarmath-ç§ã¯ãããè©ŠããŠã¿ãŸãããã以äžã§äœ¿çšããŠããã³ãŒããå€æŽããŸããã éåžžã«ããŸãæ©èœããŸããããããšãïŒ
æŽæ°ãããã«å
¬éããå Žåã¯ãã¯ã©ã€ã¢ã³ãå±éããŒã«ãæ€èšãããããããŸããããå®éã«ã¯ãIISãµãŒããŒã«ãªã¢ãŒãã·ã§ã«ãé
眮ããPowerShellã¹ã¯ãªãããå®è¡ããŠãããå転ãããããšãã§ããŸãã
psexec.exe \\IIS_SERVER cmd /c "powershell -noninteractive -file C:\FlipSymLink.ps1"
# FlipSymLink.ps1
Import-Module WebAdministration # run as admin
# create 2 site root directories
$a = 'C:\Websites\MySiteA'
$b = 'C:\Websites\MySiteB'
$appRoot = 'C:\Websites\MySite'
$appName = 'MyAppName'
$siteName = 'MySiteName'
$poolName = "MyPoolName"
New-Item -Type Directory $a -ErrorAction SilentlyContinue
New-Item -Type Directory $b -ErrorAction SilentlyContinue
# create a symlink to targeting one side
New-Item -Type SymbolicLink -Path $appRoot -Target $a -Name A -ErrorAction SilentlyContinue
New-Item -Type SymbolicLink -Path $appRoot -Target $b -Name B -ErrorAction SilentlyContinue
# point the site root to the symlink
$currentPath = (Get-ItemProperty "IIS:\Sites\$siteName\$appName" -name physicalPath)
if ($currentPath -eq "$appRoot\A") {
Write-Host "Switched to B"
New-Item $b\active.txt
Remove-Item $a\active.txt
Set-ItemProperty "IIS:\Sites\$siteName\$appName" -name physicalPath -value $appRoot\B
} else {
Write-Host "Switched to A"
New-Item $a\active.txt
Remove-Item $b\active.txt
Set-ItemProperty "IIS:\Sites\$siteName\$appName" -name physicalPath -value $appRoot\A
}
Restart-WebAppPool -Name $poolName
psexec.exe \\IIS_SERVER cmd /c "powershell -noninteractive -file C:\FlipSymLink.ps1"
ããã¯JEAãšã³ããã€ã³ãã«å€æããããšãã§ãããããææ ŒãããŠããªããŠãŒã¶ãŒãšããŠflip
ãå®è¡ã§ããŸãïŒCI / CDãµãŒããŒã®ãããã€æé ãªã©ããïŒ
Invoke-Command -ComputerName IIS_SERVER -ConfigurationName IIS-Flip -ScriptBlock { Switch-SymlinkTarget -SiteName MySite}
æ¿èªãããåè©ã§ããããã Flip
代ããã«Switch
䜿çšããŸããã
æ¿èªãããåè©ã§ããããã
Flip
代ããã«Switch
䜿çšããŸããã
Swap
ã¯ãã¹ããããæ±ããšãã«äœ¿çšãããåè©ã§ããããã§åå©çšããã®ã¯çã«ããªã£ãŠããããã§ãã
4幎åã«èª¬æããã®ãšåãåé¡ãæ±ããŠããŸãã
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ
æ°ããdllãã¡ã€ã«ãã¢ããããŒãããããã ãã«ãªã¢ãŒããã¹ã¯ããããéããããããŸããã
æ¬çªIISãµãŒããŒã§FTPã䜿çšããŠ.NETCoreã¢ããªã±ãŒã·ã§ã³DLLãã¡ã€ã«ãäžæžãããããšãããšããã¡ã€ã«ãããã¯ãããäžæžãã§ããŸããã
æ°ããããŒãžã§ã³ãå±éããã«ã¯ãIISã§ã¢ããªã±ãŒã·ã§ã³ãåæ¢ããŠïŒRDPãéããŠïŒããã¯ã解é€ããŠãããäžæžãããå¿
èŠããããŸãã
ã¢ããªã±ãŒã·ã§ã³ãåæ¢ããã«ãããã€ããããšã¯ã§ããŸããã
ããã«å¯Ÿãã解決çã¯ãããŸããïŒ ããããšã
ããŒããã©ã³ãµãŒã®èåŸã§ãã¹ãããªãã©ã€ã³ã«ããããšãã§ãããããè¿ éã«å®è¡ãããå Žåã¯ãã·ã³ããªãã¯ãªã³ã¯ãšããã€ãã®PowerShellã䜿çšãã1ã€ã®æ¹æ³ããããŸãã
ãããªããšãèããŠããŸãããã³ããŒ+ãªãµã€ã¯ã«äžã«ã¢ããªããŒã«ãåæ¢ããå¿ èŠããªããããçŸåšã®ãªã¯ãšã¹ããå®äºã§ãããããããŠã³ã¿ã€ã ãå°ãªããªããããããŒãã¹ããããããé«éã§ãã
# Setup Import-Module WebAdministration # create 2 site root directories $a = 'C:\inetpub\AspNetCoreSampleA' $b = 'C:\inetpub\AspNetCoreSampleB' $siteRoot = 'C:\inetpub\aspnetcoresample' $siteName = 'AspNetCoreSample' $poolName = "aspnetcore" New-Item -Type Directory $a New-Item -Type Directory $b # create a symlink to targeting one side New-Item -Type SymbolicLink -Path $siteRoot -Target $a # point the site root to the symlink Set-ItemProperty "IIS:\Sites\$siteName" -name physicalPath -value $siteRoot # make sure it get's picked up Restart-WebAppPool -Name $poolName # this tells you the active side Get-Item -Path $siteRoot | Select-Object -ExpandProperty target # Flip the symlink $current = (Get-Item -Path $siteRoot).Target $newTarget = if ($current -eq $a) {$b} else {$a} New-Item -Type SymbolicLink -Path $siteRoot -Target $newTarget -Force # at this point w3wp.exe still locks the current target folder until it's getting recycled # Deploy new version to the symlink which is now pointing to the other side which should have no locks robocopy \\myshare\myapp $siteRoot /mir # recycle app pool, so it picks up the new files Restart-WebAppPool -Name $poolName # bonus point: rollback is easy $current = (Get-Item -Path $siteRoot).Target $newTarget = if ($current -eq $a) {$b} else {$a} New-Item -Type SymbolicLink -Path $siteRoot -Target $newTarget -Force Restart-WebAppPool -Name $poolName
ããã«èŠç¹ããããŸã
https://gist.github.com/csharmath/b2af0f50700ce9fbdd8c5c3e582fd41b
ãããç§ããããã解決ãããšæããã®ã§ãã ASP.NETã§ã®ã¿è©ŠããŸãããããããã³ã¢ã®ãã¹ãã£ã³ã°ã¢ãžã¥ãŒã«ã§ãåãããã«æ©èœãããšæããŸãã æåã®å®è¡ã§ã¯ãµã€ããå°ãåæ¢ããã®ã§ãå°ã調æŽããããšããå§ãããŸãã
param(
[Parameter(Mandatory = $true)]
[string] $iisRootPath,
[Parameter(Mandatory = $true)]
[string] $siteName,
[Parameter(Mandatory = $true)]
[string] $artifactPath,
[Parameter(Mandatory = $false)]
[string] $siteFolderName,
[Parameter(Mandatory = $false)]
[string] $appPoolName
)
Import-Module WebAdministration
#populate optional parameters
if (!($PSBoundParameters.ContainsKey('siteFolderName'))) { $siteFolderName = $siteName }
if (!($PSBoundParameters.ContainsKey('appPoolName'))) { $appPoolName = $siteName }
#set A, B and C paths
$a = "$iisRootPath\$siteFolderName" + 'A'
$b = "$iisRootPath\$siteFolderName" + 'B'
$c = "$iisRootPath\$siteFolderName"
#existence test
$cName = Get-Item -Path $c -ErrorAction SilentlyContinue | Select-Object -ExpandProperty name -ErrorAction SilentlyContinue
$bName = Get-Item -Path $b -ErrorAction SilentlyContinue | Select-Object -ExpandProperty name -ErrorAction SilentlyContinue
#get the shudown timeout for the app pool
$shutdownTimeout = Get-WebConfigurationProperty -Filter 'system.web/httpRuntime' -PSPath "IIS:\Sites\$siteName" -Name shutdownTimeout | Select-Object -ExpandProperty Value
#create symlink, if symlink source is an existing directory, rename existing
if($cName -eq $null)
{
Write-Output "Creating SymbolicLink $c -> $a"
New-Item -Type SymbolicLink -Path $c -Target $a
}
else
{
#directories don't have a target property
$cTarget = Get-Item -Path $c | Select-Object -ExpandProperty target -ErrorAction SilentlyContinue
#this is a directory, rename and create symlink
if($cTarget -eq $null)
{
#restart AppPool first so no locked files
#Write-Output "Restarting AppPool $appPoolName"
#Restart-WebAppPool -Name $appPoolName
#stop AppPool first so no locked files
Write-Output "Stopping AppPool $appPoolName"
Stop-WebAppPool -Name $appPoolName
#sleep for shutdownTimeout
Write-Output "Sleeping for $shutdownTimeout"
Start-Sleep -Seconds (([System.TimeSpan]::Parse("$shutdownTimeout").TotalSeconds) * 1.1)
try {
#if the rename fails, there are files in use. stop the script
$newName = $siteFolderName + 'A'
Write-Output "Renaming $c to $newName"
Rename-Item -Path $c -NewName $newName -ErrorAction Stop
}
catch {
Write-Error -Message "Failed to rename $c to $newName due to files in use."
#start AppPool
Write-Output "Starting AppPool $appPoolName due to failed folder rename. Consider trying again durring a time with reduced traffic."
Start-WebAppPool -Name $appPoolName
}
#create symlink
Write-Output "Creating SymbolicLink $c -> $a"
New-Item -Type SymbolicLink -Path $c -Target $a
#start AppPool
Write-Output "Starting AppPool $appPoolName"
Start-WebAppPool -Name $appPoolName
#copy a to b to pick up directory permissions
if($bName -eq $null)
{
Write-Output "Copying Directory $a to $b"
robocopy $a $b /e /sec /sl
}
}
}
#existence test
$aName = Get-Item -Path $a -ErrorAction SilentlyContinue | Select-Object -ExpandProperty name -ErrorAction SilentlyContinue
$bName = Get-Item -Path $b -ErrorAction SilentlyContinue | Select-Object -ExpandProperty name -ErrorAction SilentlyContinue
#create if needed
if($aName -eq $null)
{
Write-Output "Creating Directory $a"
New-Item -Type Directory $a
}
if($bName -eq $null)
{
Write-Output "Creating Directory $b"
New-Item -Type Directory $b
}
#make sure site pointing to symlink
Write-Output "Pointing Website $siteName to Path $c"
Set-ItemProperty "IIS:\Sites\$siteName" -name physicalPath -value $c
#restart so we know it's loading from symlink
Write-Output "Restarting AppPool $appPoolName"
Restart-WebAppPool -Name $appPoolName
#sleep for shutdownTimeout
Write-Output "Sleeping for $shutdownTimeout"
Start-Sleep -Seconds ([System.TimeSpan]::Parse("$shutdownTimeout").TotalSeconds)
#get current symlink target and set new target
Get-Item -Path $c | Select-Object -ExpandProperty target
$current = (Get-Item -Path $c).Target
$newTarget = if ($current -eq $a) {$b} else {$a}
$fileOrDirectoryName = Get-Item $artifactPath | Select-Object -ExpandProperty name
#test for .zip
if(($fileOrDirectoryName).ToLower().EndsWith(".zip") -eq $true)
{
#copy to temp location
$guid = [System.Guid]::NewGuid()
$tempPath = "$iisRootPath\temp-$guid"
$tempDest = "$iisRootPath\temp-dest-$guid"
Write-Output "Creating temp directory $tempPath"
New-Item -Type Directory $tempPath
$artifactDirectory = [System.IO.Path]::GetDirectoryName($artifactPath)
$artifactFile = [System.IO.Path]::GetFileName($artifactPath);
#TODO: first robocopy arg needs to be a directory, not a file
Write-Output "Copying archive from $artifactPath to $tempPath"
robocopy $artifactDirectory $tempPath $artifactFile
#extract to temp destination (seems a failed extract can leave empty folders)
Write-Output "Extracting archive to $tempDest"
Expand-Archive -Path "$tempPath\$fileOrDirectoryName" -DestinationPath $tempDest -Force
#copy from temp destination to destination
Write-Output "Copying files from $tempDest to $newTarget"
robocopy $tempDest $newTarget /e
#delete temp directory
Write-Output "Removing temp directory $tempPath"
Remove-Item -Path $tempPath -Recurse -Force
#delete temp directory
Write-Output "Removing temp directory $tempDest"
Remove-Item -Path $tempDest -Recurse -Force
}
else
{
#copy new files
Write-Output "Copying files from $artifactPath to $newTarget"
robocopy $artifactPath $newTarget /e
}
#swap symlink
Write-Output "Pointing SymbolicLink $c -> $newTarget"
New-Item -Type SymbolicLink -Path $c -Target $newTarget -Force
#restart so it loads from newly swapped symlink
Write-Output "Restarting AppPool $appPoolName"
Restart-WebAppPool -Name $appPoolName
@LucidObscurityããã¯äœã§ããïŒ cmdã³ãŒãïŒ ãã®ã³ãŒãã¯ã©ãã«è¿œå ããå¿
èŠããããŸããïŒ
ããããšã
ããã»ã¹ããªãªãŒã¹ãããŸã§ã msdeploy
ã³ãã³ãã®åè©Šè¡åæ°ïŒãã©ã¡ãŒã¿ãŒïŒ -retryAttempts:X
ïŒãŸãã¯åè©Šè¡æéééïŒãã©ã¡ãŒã¿ãŒïŒ -retryInterval:XXXX
ïŒãå¢ãããšããã¢ã€ãã¢ã¯ã©ãã§ããããããã¡ã€ã«ããã¯ïŒ
@davidfowlã¯æ£ãããšæããŸããããã»ã¹ã¯ãŸã ããã«ããããã¡ã€ã«ãããã¯ããŸãã IISããªã»ããããŠã圹ã«ç«ã¡ãŸã
ããŒã«ã«ã®ç§ã«ãšã£ãŠã¯ãããã»ã©é·ãåŸ
ã¡ãããªãã®ã§ããã®ã·ã£ããããŠã³æéå¶éïŒç§ïŒã5ã«æŽæ°ãããããžã§ã¯ããã¡ã€ã«ãæŽæ°ããŠãã«ãåã«app_offline.htmãçæãããã«ãåŸã«åé€ããŸããã ããã¯ããŸããããŸãã
ãµãŒããŒã®å Žåã msdeployã䜿çšããŠapp_offline.htmãåé€ããŸãã msdeployã§ã¯ããã¡ã€ã«ãããã¯ãããŠããå Žåã¯åè©Šè¡ããŸããã90ç§åã«è«Šããããããããã€ãå床ããªã¬ãŒããå¿
èŠãããã2åç®ã®è©Šè¡ã§æ©èœããŸãã
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ ãã®æ°ãããªãªãŒã¹ã®æºåã¯ãã€ã§ããïŒ
ãåãåããããã ãããããšãããããŸãã
ãã®åé¡ã¯ãå°æ¥ã®è©äŸ¡/æ€èšã®ããã«Next sprint planning
ãã€ã«ã¹ããŒã³ã«ç§»åããŸãã 次ã®ãã€ã«ã¹ããŒã³ã®äœæ¥ãèšç»ãããšãã«ããªã¯ãšã¹ããè©äŸ¡ããŸãã 次ã«äœãäºæ³ããããã®åé¡ãã©ã®ããã«åŠçããããã«ã€ããŠè©³ããã¯ãããªã¢ãŒãžããã»ã¹ã®è©³çŽ°ããã¡ãã§ã芧ãã ããã
ä»é±ã.NET4.5.2ã¢ããªã±ãŒã·ã§ã³ã.NET5.0ã«å€æããåŸããã®åé¡ã«ã€ããŠçºèŠããŸããã ãããå æããå¥ã®ã¢ãããŒãããããŸãã IISãµãŒããŒã§å®è¡ãããŠããWindowsãµãŒãã¹ãäœæããŸããã ãã®ãµãŒãã¹ã§ã¯ãã«ã¹ã¿ã ããŒãã§å®è¡ãããŠããåçŽãªHTTPãµãŒããŒããããŸãã Webã¢ããªã±ãŒã·ã§ã³ã¯ããã®ãµãŒããŒã«å¯ŸããŠPOSTãªã¯ãšã¹ããå®è¡ããŠãã¢ããã°ã¬ãŒããéå§ã§ããŸãã ã¢ããªããŒã«ãåæ¢ãããã®ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ããã»ã¹ã匷å¶çµäºããçŸåšã®ãªãªãŒã¹ã®ããã¯ã¢ãããäœæããçŸåšã®ãªãªãŒã¹ãåé€ããupgradepackageãããŠã³ããŒãããŠæœåºããŸãã ãã®åŸãã¢ããªããŒã«ãåéããŸãã
äžèšã®WindowsãµãŒãã¹ããã§ãããããªããžããªã«ããã·ã¥ãããã¢ããã°ã¬ãŒãããã±ãŒãžãäœæããããã«ãåçŽãªWindowsãã©ãŒã ã¢ããªã±ãŒã·ã§ã³ãäœæããŸããã
æãåèã«ãªãã³ã¡ã³ã
ð
éè€ãããªãµã€ã¯ã«ããµããŒãããªãããšã¯ååž°ã§ãã