真正解决ASP.NET每一个页面首次访问超级慢的问题

简介: 真正解决ASP.NET每一个页面首次访问超级慢的问题

用过ASP.NET的人都知道吧,页面首次打开很慢。

本来网站第一次启动就慢,但别的页面如果没有访问过,去访问也会慢。


好吧,你也许认为它是在编译ASPX,或者加载一些东西。

我也这样认为过。


不过我发现不是这样的。

1.bin目录里面你放多少它加载多少,如果放一些无效的DLL,比如在32位下面放一些纯64位的DLL,就会直接报错;

2.aspx页面解析非常快,那么转成CS也是一瞬间,编译更不用说,不应该是卡上2-5秒,1秒是可以接受的;


那么要做的就是不让它干这些坏事,总之我从来都不觉得它会老老实实的给你服务。


禁止证书的验证过程:

1、在下面aspnet.config文件中加入下面内容:

   32位系统:C:\Windows\Microsoft.Net\Framework\v2.0.50727\aspnet.config

   64位系统:C:\Windows\Microsoft.NET\Framework64\v2.0.50727\aspnet.config

  有4.0,甚至4.5的自己多改几个地方,如果是64位的系统,可能需要以管理员身份打开编辑器,再打开这个文件,否则无法保存的。


[xhtml]  查看源代码 复制
1. <?xml version="1.0" encoding="utf-8"?>  
2. <configuration>   
3.     <runtime>  
4.         <generatePublisherEvidence enabled="false"/>  
5.     </runtime>  
6. </configuration>

对"Network Service"帐号下运行的所有程序禁止证书检查

   不会的话就忽略吧。

   导入以下注册表内容,自己先另存为*.reg文件吧,如果会手工操作的话,就手工来吧。


[txt]  查看源代码 复制
1. Windows Registry Editor Version 5.00  
2.   
3. [HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\WinTrust\Trust Providers\Software Publishing]  
4.   
5. "State"=dword:00023e00


然后记得重启一下应用程序池(实在不知道,就重启IIS服务),再去看看你的网站,首次加载快吗?其它页面访问快吗?



忍受不了时,就再也不用忍受!




下面是专业的分析记录,看不懂就当没见过吧。。。

详细分析  
==========  
这个时候如果我们抓取一个hang dump的话,页面所对应的managed callstack往往如下,很明显它正在加载一个Assembly  
0:022> !CLRStack  
OS Thread Id: 0xeb4 (22)  
Child-SP RetAddr Call Site  
000000001af1c900 000007fef91747c3 System.Reflection.Assembly.InternalLoad(System.Reflection.AssemblyName, System.Security.Policy.Evidence,  
System.Threading.StackCrawlMark ByRef, Boolean)  
000000001af1c990 000007ff0141f0f9 System.Reflection.Assembly.Load(System.Reflection.AssemblyName)  
000000001af1c9d0 000007fef9fdd502 Microsoft.SharePoint.Portal.WebControls.StringResourceManager..cctor()  
000000001af1db50 000007ff014135e2 Microsoft.SharePoint.Portal.WebControls.MySiteLinkUserControl.SetControl()  
000000001af1dce0 000007fef398e04f Microsoft.SharePoint.Portal.WebControls.MySiteLinkUserControl.OnInit(System.EventArgs)  
000000001af1de80 000007fef398f3af System.Web.UI.Control.InitRecursive(System.Web.UI.Control)  
000000001af1dee0 000007ff014133c8 System.Web.UI.Control.AddedControl(System.Web.UI.Control, Int32)  
000000001af1df50 000007ff0134115e Microsoft.SharePoint.WebControls.DelegateControl.AddControlResilient(System.Web.UI.Control)  
000000001af1dff0 000007fef398fb22 Microsoft.SharePoint.WebControls.DelegateControl.CreateChildControls()  
000000001af1e170 000007ff01341024 System.Web.UI.Control.EnsureChildControls()  
000000001af1e1d0 000007fef398e04f Microsoft.SharePoint.WebControls.DelegateControl.OnInit(System.EventArgs)  
000000001af1e210 000007fef398e147 System.Web.UI.Control.InitRecursive(System.Web.UI.Control)  
000000001af1e270 000007fef398e147 System.Web.UI.Control.InitRecursive(System.Web.UI.Control)  
000000001af1e2d0 000007fef398e147 System.Web.UI.Control.InitRecursive(System.Web.UI.Control)  
000000001af1e330 000007fef398e147 System.Web.UI.Control.InitRecursive(System.Web.UI.Control)  
000000001af1e390 000007fef398e147 System.Web.UI.Control.InitRecursive(System.Web.UI.Control)  
000000001af1e3f0 000007fef398a935 System.Web.UI.Control.InitRecursive(System.Web.UI.Control)  
000000001af1e450 000007fef398a1f0 System.Web.UI.Page.ProcessRequestMain(Boolean, Boolean)  
000000001af1e520 000007fef398a11b System.Web.UI.Page.ProcessRequest(Boolean, Boolean)  
000000001af1e580 000007fef398a0b0 System.Web.UI.Page.ProcessRequest()  
000000001af1e5e0 000007fef3991557 System.Web.UI.Page.ProcessRequest(System.Web.HttpContext)  
000000001af1e640 000007fef395567b System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()  
000000001af1e6f0 000007fef39634b5 System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef)  
000000001af1e790 000007fef3954733 System.Web.HttpApplication+ApplicationStepManager.ResumeSteps(System.Exception)  
000000001af1e840 000007fef3958a54 System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext, System.AsyncCallback,  
System.Object)  
000000001af1e8a0 000007fef395863c System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest)  
000000001af1e930 000007fef395726c System.Web.HttpRuntime.ProcessRequestNoDemand(System.Web.HttpWorkerRequest)  
000000001af1e970 000007fef9fdd502 System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr, Int32)  
其实它所要加载的Assembly名字如下  
Microsoft.SharePoint.Portal.intl  
此线程所对应的native callstack如下  
0:022> k20  
Child-SP RetAddr Call Site  
00000000'1af1a208 000007fe'fdc610ac ntdll!ZwWaitForSingleObject+0xa  
00000000'1af1a210 000007fe'f5dfa2fa KERNELBASE!WaitForSingleObjectEx+0x79 00000000'1af1a2b0 000007fe'f5df76fa cryptnet!CryptRetrieveObjectByUrlWithTimeout+0x263  
00000000'1af1a5b0 000007fe'f5df4646 cryptnet!CryptRetrieveObjectByUrlW+0x20f 00000000'1af1a7a0 000007fe'f5df9c34 cryptnet!RetrieveObjectByUrlValidForSubject+0x162 00000000'1af1a8d0 000007fe'f5df4243 cryptnet!RetrieveTimeValidObjectByUrl+0x2de 00000000'1af1a9c0 000007fe'f5df3c72 cryptnet!CTVOAgent::GetTimeValidObjectByUrl+0x2e3 00000000'1af1ab20 000007fe'f5df38ad cryptnet!CTVOAgent::GetTimeValidObject+0x7cf  
00000000'1af1ad00 000007fe'f5df3810 cryptnet!FreshestCrlFromCrlGetTimeValidObject+0x61  
00000000'1af1ad70 000007fe'f5df99fc cryptnet!CryptGetTimeValidObject+0xb0 00000000'1af1adf0 000007fe'f5df345d cryptnet!GetTimeValidCrl+0x4b7  
00000000'1af1af30 000007fe'f5df3f82 cryptnet!GetBaseCrl+0x7d 00000000'1af1afc0 000007fe'f5df3d58 cryptnet!MicrosoftCertDllVerifyRevocation+0x238  
00000000'1af1b110 000007fe'fdb157c7 cryptnet!CertDllVerifyRevocation+0x28  
00000000'1af1b160 000007fe'fdb1552e crypt32!VerifyDefaultRevocation+0x398 00000000'1af1b250 000007fe'fdb15c09 crypt32!CertVerifyRevocation+0x144  
...  
00000000'1af1bcc0 000007fe'f9e46c27 mscorwks!PEFile::CheckSecurity+0x39b924  
00000000'1af1bd50 000007fe'f9e5eb5d mscorwks!PEAssembly::DoLoadSignatureChecks+0x37  
00000000'1af1bd90 000007fe'f9e52ff8 mscorwks!PEAssembly::PEAssembly+0x12d 00000000'1af1be00 000007fe'f9e40b9d mscorwks!PEAssembly::DoOpen+0x11c 00000000'1af1c130 000007fe'f9f24a3e mscorwks!PEAssembly::Open+0x71  
从这些函数名我们知道它正在做一些证书检查之类的事情。而实际上它正在等待下面的这个线程。  
0:036> kn  
# Child-SP RetAddr Call Site  
00 00000000'2409e1c8 000007fe'fdc610ac ntdll!ZwWaitForSingleObject+0xa  
01 00000000'2409e1d0 000007fe'f5d7f38e KERNELBASE!WaitForSingleObjectEx+0x79  
02 00000000'2409e270 000007fe'f5d80a27 winhttp!IsWpadEnabledForConnectedNetworks+0x1f2  
03 00000000'2409e340 000007fe'f5d806dc winhttp!ReadWinInetProxySettings+0x1c3  
04 00000000'2409e3c0 000007fe'f5dfae42 winhttp!WinHttpGetIEProxyConfigForCurrentUser+0x28a  
05 00000000'2409e510 000007fe'f5df9237 cryptnet!InetGetProxy+0x11e  
06 00000000'2409e600 000007fe'f5df983d cryptnet!InetSendAuthenticatedRequestAndReceiveResponse+0x190  
07 00000000'2409f770 000007fe'f5df9d9c cryptnet!InetSendReceiveUrlRequest+0x57e  
.....  
0:036> .frame 7  
07 00000000'2409f770 000007fe'f5df9d9c cryptnet!InetSendReceiveUrlRequest+0x57e [d:\w7rtm\ds\security\cryptoapi\pki\rpor\inetsp.cpp @ 2603]  
0:036> dv  
hInetSession = 0x00000000'218211f0  
pwszUrl = 0x00000000'1f8abe50 "http://crl.microsoft.com/pki/crl/products/CSPCA.crl"  
dwRetrievalFlags = 1  
pCredentials = 0x00000000'00000000  
pcba = 0x00000000'2409fab0  
ppfnFreeObject = 0x00000000'2409fb38  
ppvFreeContext = 0x00000000'2409fb30  
pAuxInfo = 0x00000000'1f8abd78  
phInetRequest = 0x00000000'00000000  
我们可以看到,当时我们抓取dump的时候它正在尝试连接http://crl.microsoft.com/pki/crl/products/CSPCA.crl
相关文章
|
3月前
|
开发框架 JavaScript 前端开发
揭秘:如何让你的asp.net页面变身交互魔术师——先施展JavaScript咒语,再引发服务器端魔法!
【8月更文挑战第16天】在ASP.NET开发中,处理客户端与服务器交互时,常需先执行客户端验证再提交数据。传统上使用ASP.NET Button控件直接触发服务器事件,但难以插入客户端逻辑。本文对比此法与改进方案:利用HTML按钮及JavaScript手动控制表单提交。后者通过`onclick`事件调用JavaScript函数`SubmitForm()`来检查输入并决定是否提交,增强了灵活性和用户体验,同时确保了服务器端逻辑的执行。
48 5
|
24天前
|
SQL XML 关系型数据库
入门指南:利用NHibernate简化.NET应用程序的数据访问
【10月更文挑战第13天】NHibernate是一个面向.NET的开源对象关系映射(ORM)工具,它提供了从数据库表到应用程序中的对象之间的映射。通过使用NHibernate,开发者可以专注于业务逻辑和领域模型的设计,而无需直接编写复杂的SQL语句来处理数据持久化问题。NHibernate支持多种数据库,并且具有高度的灵活性和可扩展性。
39 2
|
6月前
|
开发框架 .NET 中间件
七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
134 7
|
2月前
|
SQL 存储 关系型数据库
C#一分钟浅谈:使用 ADO.NET 进行数据库访问
【9月更文挑战第3天】在.NET开发中,与数据库交互至关重要。ADO.NET是Microsoft提供的用于访问关系型数据库的类库,包含连接数据库、执行SQL命令等功能。本文从基础入手,介绍如何使用ADO.NET进行数据库访问,并提供示例代码,同时讨论常见问题及其解决方案,如连接字符串错误、SQL注入风险和资源泄露等,帮助开发者更好地利用ADO.NET提升应用的安全性和稳定性。
219 6
|
3月前
|
算法 Java 测试技术
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
|
3月前
|
API
【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)
【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)
|
3月前
|
开发框架 前端开发 .NET
七天.NET 8操作SQLite入门到实战 - (3)第七天Blazor学生管理页面编写和接口对接
七天.NET 8操作SQLite入门到实战 - (3)第七天Blazor学生管理页面编写和接口对接
|
4月前
|
开发框架 前端开发 JavaScript
基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用
基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用
|
4月前
|
开发框架 缓存 NoSQL
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
|
3月前
【Azure 应用服务】App Service 配置 Application Settings 访问Storage Account得到 could not be resolved: '*.file.core.windows.net'的报错。没有解析成对应中国区 Storage Account地址 *.file.core.chinacloudapi.cn
【Azure 应用服务】App Service 配置 Application Settings 访问Storage Account得到 could not be resolved: '*.file.core.windows.net'的报错。没有解析成对应中国区 Storage Account地址 *.file.core.chinacloudapi.cn