Azure启动任务中的aspnet_compiler

3
有人知道是否可以从 Azure 角色启动任务调用 aspnet_compiler,以强制就地进行预编译吗?(如果可以的话,是前台/后台还是简单任务?)
也许类似于: %windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_precompile.exe -v / -p "F:\siteroot\0"
或者是否有更好的方法来完成这个任务?

您的命令是正确的,除了一个打字错误,应该是sitesroot而不是siteroots。 - zbarrier
应该使用aspnet_compiler.exe(而不是aspnet_precompile) - Mister Cook
2个回答

2

是的,一旦您找到正确的编译器路径,这应该可以工作,尽管我没有尝试过这种特定方法。

另一种我尝试过的方法是使用ClientBuildManager.PrecompileApplication,如此答案所述。我尝试从OnStart()中调用它,但您可以将C#代码编译为.NET程序集并从PowerShell中使用它,或者只需按此处所述调用.NET基元,并以此方式从启动任务中调用它。


1
ClientBuildManager.PrecompileApplication听起来是一个不错的方法。 当从on start调用它时,您为ClientBuildManager指定了哪些构造函数参数?我不太确定我应该如何获得正确的路径。 - jmw
1
@JWendel: 你可以使用Microsoft.Web.Administration.ServerManager,枚举所有的Sites,对于每一个Site枚举所有的Applications,对于每一个Application - 所有的VirtualDirectories和其中的每个都有PathPhysicalPath - 这两个参数可以传递到ClientBuildManager构造函数中。 - sharptooth
非常感谢!我将尝试它。对于其他寻找Microsoft.Web.Administration的人,它可以作为NuGet包使用 - http://nuget.org/packages/Microsoft.Web.Administration/。 - jmw

0
一个启动任务是可行的,但其中一个问题是siteroot路径是硬编码的,这可能会发生变化。相反,将以下内容添加到RoleEntryPoint OnStart方法中:
 using (var serverManager = new ServerManager())
        {
            string siteName = RoleEnvironment.CurrentRoleInstance.Id + "_" + "Web";
            var siteId = serverManager.Sites[siteName].Id;
            var appVirtualDir = $"/LM/W3SVC/{siteId}/ROOT";  // Do not end this with a trailing /

            var clientBuildManager = new ClientBuildManager(appVirtualDir, null, null,
                                        new ClientBuildManagerParameter
                                        {
                                            PrecompilationFlags = PrecompilationFlags.Default,
                                        });

            clientBuildManager.PrecompileApplication();
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接