如何减少第一个请求的响应时间

时间:2016-05-04 18:40:11

标签: .net asp.net-mvc entity-framework

在Asp.net上工作mvc5 代码优先 EF-6。我的应用程序数据模型足够大,因此 ObjectContext 具有访问数据库所需的许多类,然后处理类可能会延迟Web应用程序对页面的第一个请求的响应。该怎么办?如何增加应用程序响应?

注意:到目前为止,我知道当应用程序第一次创建ObjectContext的对象时,实体框架会处理访问数据库所需的一组类。在这种情况下,如果您的数据模型很大,那么创建类可能会将Web应用程序响应延迟到第一个页面请求。想知道如何减少这种反应。

2 个答案:

答案 0 :(得分:0)

当EF启动时,它将运行数据库初始化程序。如果删除默认为CreateDatabaseIfNotExists<TContext>

的初始化程序,则可以获得一点速度提升
Database.SetInitializer<YourContextType>(null); //System.Data.Entity namespace

通常人们将其放在Global.asax或DbContext

的静态构造函数中

答案 1 :(得分:0)

通常,您会在Application_Start文件的Global.asax事件中保留任何启动逻辑。但是在第一次用户访问之前不会触发,如果你正在做一些繁重的处理,这需要花费很多时间,对第一个用户来说可能会非常令人沮丧。

要克服这种情况,您可以将应用程序配置为自动启动并执行预加载逻辑。

为此你需要创建一个实现IProcessHostPreloadClient接口的类,并在其中编写初始化逻辑 -

    public class ApplicationPreload : System.Web.Hosting.IProcessHostPreloadClient 
    {
        public void Preload(string[] parameters) 
        {
                // Write initialization and loading logic here
         }
    } 

接下来,您需要通过添加applicationHost.config属性在startMode="AlwaysRunning" C:\ Windows \ System32 \ inetsrv \ config \ applicationHost.config )中注册相关信息到适当的<applicationPools> -

<applicationPools>
     <add name="MyAppWorkerProcess" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools> 

在同一文件中注册自动启动提供程序 -

<!-- Just AFTER closing the `sites` element AND AFTER `webLimits` tag -->
<serviceAutoStartProviders>
    <add name="ApplicationPreload" type="WebApplication1.ApplicationPreload, WebApplication1" />
</serviceAutoStartProviders>

最后,在<Sites>中,找到您的网站并指定提供商 -

<sites>
    <site name="MySite" id="1">
        <application path="/" serviceAutoStartEnabled="true"
                              serviceAutoStartProvider="ApplicationPreload" />
    </site>
</sites>

如果您不想对applicationHost.config进行更改,也可以通过IIS进行这些更改。

更多细节可以在这里找到 - http://weblogs.asp.net/scottgu/auto-start-asp-net-applications-vs-2010-and-net-4-0-series

话虽如此,如果您的设计允许,您还应该尝试最小化启动时所需的数据量,并加载相关的上下文数据。