gpt4 book ai didi

asp.net - Azure预编译似乎不起作用

转载 作者:行者123 更新时间:2023-12-02 14:08:53 24 4
gpt4 key购买 nike

我尝试预编译我的 Azure Web 应用程序,因此页面的每次第一次点击不会花费几秒钟的时间。

我的 WebRole.Run() 中有以下代码:

using ( var server_manager = new ServerManager() )
{
var main_site = server_manager.Sites[RoleEnvironment.CurrentRoleInstance.Id + "_Web"];
var main_application = main_site.Applications["/"];
var main_application_pool = server_manager.ApplicationPools[main_application.ApplicationPoolName];

string physical_path = main_application.VirtualDirectories["/"].PhysicalPath;

main_application["preloadEnabled"] = true;
main_application_pool["autoStart"] = true;
main_application_pool["startMode"] = "AlwaysRunning";

server_manager.CommitChanges();

Log.Info( "Building Razor Pages", "WebRole" );

var build_manager = new ClientBuildManager( "/", physical_path );
build_manager.PrecompileApplication();

Log.Info( "Building Razor Pages: Done", "WebRole" );
}

它似乎没有抛出任何异常,当我查看日志时,大约需要 55 秒才能执行 build_manager.PrecompileApplication()

对我来说似乎是正确的。

除了当我第一次尝试加载页面时它仍然会受到影响。如果我查看 MiniProfiler,我会发现查找部分需要很长时间。我仍然怀疑这是编译,因为仅仅查找一个文件 1.5 秒对我来说似乎有点长。

enter image description here

我上面的做法有什么问题吗?有没有办法检查页面是否真的编译过?如果它被编译了,它还能是什么?为什么事情如此复杂..

最佳答案

我从来没有太努力过。可能是一些奇怪的 Web.config/Azure/项目设置似乎已关闭,但我从未找到它。

在您进一步阅读之前,我建议您首先在您的项目中尝试这种方法:https://stackoverflow.com/a/15902360/647845 。(因为它不依赖于黑客)

我的解决方法相对简单,我搜索应用程序中的所有 Razor View ,然后尝试使用模拟的 ControllerContext 渲染它们,忽略结果。由于 ViewModel 无效,几乎所有 View 都会抛出异常,但只要 View 首先被编译,这并不重要。

private void PrecompileViews()
{
string search_path = GetSearchPath();

// Create a dummy ControllerContext - using the HomeController, but could be any controller
var http_context = new HttpContext( new HttpRequest("", "http://dummy", ""), new HttpResponse(new StringWriter()) );
http_context.Request.RequestContext.RouteData.Values.Add( "controller", "Home" );
var controller_context = new ControllerContext( new HttpContextWrapper(http_context), http_context.Request.RequestContext.RouteData, new HomeController() );

// loop through all views, and try to render them with the dummy ControllerContext
foreach ( var file in Directory.GetFiles(search_path, "*.cshtml", SearchOption.AllDirectories) )
{
string relative_view_path = "~" + file.Replace( search_path, "", StringComparison.InvariantCultureIgnoreCase );

var view_result = new ViewResult { ViewName = relative_view_path };

try
{
view_result.ExecuteResult( controller_context );
}
catch (Exception)
{
// Almost all views will throw exceptions, because of a non valid ViewModel,
// but that doesn't matter because the view stills got compiled
}
}
}

GetSearchPath 返回应用程序的根目录:

private string GetSearchPath()
{
string bin_path = Path.GetDirectoryName( Assembly.GetExecutingAssembly().GetName().CodeBase );
string local_path = new Uri(bin_path).LocalPath;
return Path.GetFullPath( Path.Combine( local_path, ".." ) );
}

我在 Global.asax 的末尾将其全部称为:

protected void Application_Start()
{
[...]
PrecompileViews();
}

关于asp.net - Azure预编译似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21269451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com