2016-05-04 70 views
0

在Asp.net上工作mvc5 Code-First EF-6。我的應用程序數據模型足夠大,所以ObjectContext有很多訪問數據庫所需的類,然後處理這些類可能會延遲Web應用程序對第​​一個頁面請求的響應。該怎麼辦?如何增加應用程序響應?如何減少首次請求的響應時間

注意:到目前爲止,我知道當應用程序第一次創建ObjectContext的對象時,實體框架在訪問數據庫所需的一組類上工作。在這種情況下,如果您的數據模型很大,那麼創建類可能會延遲Web應用程序對第​​一個頁面請求的響應。想知道如何減少這種反應。

+0

「可能延遲」還是「延遲」?你是否已經證明在你嘗試解決它之前它確實是一個問題?您知道上下文不會將模型中的所有數據加載到該模型中,對嗎? –

回答

0

當EF啓動時,它將運行您的數據庫初始值設定項。你可以得到一個有點速度提升的,如果你刪除初始默認爲CreateDatabaseIfNotExists<TContext>

Database.SetInitializer<YourContextType>(null); //System.Data.Entity namespace 

一般人地方,在Global.asax或的DbContext

0

靜態構造函數通常你會繼續在Global.asax文件中Application_Start事件中的任何啓動邏輯。但是,直到第一次用戶訪問時纔會觸發,如果您正在進行一些耗費大量時間的繁重處理,那麼第一個用戶可能會感到非常沮喪。

要克服這種情況,可以將應用程序配置爲自動啓動並執行預加載邏輯。

爲此,你需要創建一個實現IProcessHostPreloadClient接口的類,並寫在它的初始化邏輯 -

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

接下來,你需要在applicationHost.config註冊這個信息(C:\ WINDOWS \ SYSTEM32 \ INETSRV \設置\的applicationHost.config)通過添加startMode="AlwaysRunning"屬性到適當<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

說了這麼多,你也應該儘量避免在啓動時所需的數據量和負載只是相關的情境數據,如果您的設計允許被發現。