我有许多ASP.NET(4.0)Web应用程序,在每个请求期间似乎泄漏(少量)内存.这是一个很小的数量,对于大多数用例来说,它不会成长为几周甚至几个月的问题.我通常会尝试关闭应用程序管理的任何连接,避免状态变量(或我的单例的实例变量)等.
我的问题是 - 这是ASP.NET应用程序的正常行为吗?我已经关闭了在闲置20分钟后回收应用程序池的默认(IIS 7)行为.我这样做是因为应用程序需要几分钟来构建其内部缓存,我希望避免对用户体验产生负面影响(让他们在发出请求时等待应用程序启动).
我知道这可以通过序列化缓存或加快缓存生成过程来缓解,但我的问题更多地与它的原理有关:我个人认为依赖IIS自动回收功能作为一种绑定方法.我错了吗?我只是没有看到垃圾收集器在工作,因为应用程序的内存使用量与可用内存量相比不够高?还是我应该深入研究记忆问题?
任何见解将不胜感激.
我已经成功地自动创建了一个新的IIS网站,但是我编写的代码并不关心应用程序池,它只是添加到DefaultAppPool中.但是,我想将这个新创建的站点添加到现有的应用程序池中.
这是我用来创建新网站的代码.
var w3Svc = new DirectoryEntry(string.Format("IIS://{0}/w3svc", webserver));
var newsite = new object[] { serverComment, new object[] { serverBindings }, homeDirectory };
var websiteId = w3Svc.Invoke("CreateNewSite", newsite);
site.Invoke("Start", null);
site.CommitChanges();
Run Code Online (Sandbox Code Playgroud)
< 更新 >
虽然这与问题没有直接关系,但以下是上面使用的一些示例值.这可能有助于人们更准确地理解上面代码的作用.
< / update >
如果我知道我希望此网站所在的应用程序池的名称,我该如何找到它并将其添加到该网站?
我在Web服务器(Server 2008 Enterprise)上安装了.NET Framework 3.5 SP1,因此运行IIS 7.0.
我想更改现有站点使用的.NET Framework版本.因此,我右键单击相应的应用程序池并选择"编辑应用程序池"..NET Framework下拉列表不包含框架3.5的显式条目,但仅包括2.0.50727.
这只是因为3.5版核心RTL的版本仍然是2.0?或者我是否需要做一些额外的事情才能让IIS看到版本3.5?(尝试重启IIS).
我希望我的MVC3 Web应用程序访问%APPDATA%(例如C:\Users\MyUsername\AppData\Roaming在Windows 7上),因为我在那里存储配置文件.因此,我在IIS中创建了一个具有用户"MyUsername"标识的应用程序池,通过使用该帐户登录创建了该用户的配置文件,并打开了"加载用户配置文件"选项(默认情况下仍为true).模拟被关闭.
现在我遇到%APPDATA%(在C#中)的问题:
appdataDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
Run Code Online (Sandbox Code Playgroud)
解决c:\windows\system32\inetsrv而不是C:\Users\MyUsername\AppData\Roaming.
更新:更确切地说,上面的C#代码返回一个空字符串,以便Path.GetFullPath(Path.Combine(appdataDir, "MyAppName"))将当前路径预先设置为我的应用程序名称,从而产生c:\windows\system32\inetsrv\MyAppName.
我知道我之前使用Windows Server 2008 R2上的相同Web应用程序完成了这项工作,现在我在Windows 7上
使用与IIS相同的主要版本7.5来解决此问题.我使用了与以前相同的过程:创建了一个新用户,以该用户身份登录以创建配置文件和APPDATA目录,然后添加具有此标识的应用程序池,最后将Web应用程序添加到此池中.
有任何想法吗?
iis application-pool appdata iis-7.5 applicationpoolidentity
在IIS中,选择默认网站>属性>主目录>应用程序设置>配置>选项,默认会话超时为20分钟.此外,选择应用程序池> DefaultAppPool>属性,在性能选项卡中,有空闲超时,默认为20分钟.这两次超时有什么不同?
当我启动应用程序池,并在该池中的应用程序中请求页面时,我收到"HTTP错误503.该服务不可用".
如果我查看IIS中的应用程序池,我可以看到它现在已停止.转到事件查看器我发现此错误消息:
'应用程序池Badge.Web的标识无效.为身份指定的用户名或密码可能不正确,或者用户可能没有批量登录权限.如果未更正标识,则在应用程序池收到第一个请求时将禁用应用程序池.如果批处理登录权限导致问题,则在Windows进程激活服务(WAS)重试登录之前,必须在授予权限后更改IIS配置存储中的标识.如果在处理完第一次应用程序池请求后标识仍然无效,则将禁用应用程序池.数据字段包含错误编号.
我非常确定我使用的凭证是正确的.其他东西导致应用程序池停止.
我有一个带有IIS 8.0的Windows Server 2012.它托管了许多用户群较少的小型网站,这些网站在任何方面都不是关键任务.对于小型网站,我的意思是应用程序代码和内存占用量非常低,但由于加载的库(如EntityFramework),应用程序的内存消耗在新启动和空闲时大约为140MB.
一般来说,这对于一个成熟的网络服务器来说并不是什么大不了的事,但我只有一个带有4GB内存的VPS,它还可以运行其他几个应用程序(数据库,BIND,hMail等).我正在使用它作为开发服务器来使用许多不同的技术.因此,我在服务数十个~140MB w3wp时快速耗尽RAM.
除了在空闲时暂停,我还想减少内存消耗,同时仍然使用我想要使用的任何框架或库 - 这实际上是整个事情的目的.
简而言之:由于应用程序不仅共享相同的.NET版本,而且还有一些像EF或MVC这样的库,在一个app_pool中运行多个站点以便它们可以共享库更有意义吗?或者,无论如何,每个站点都会加载自己的副本(由于此处讨论的不同的应用程序域)?
奖金问题:在考虑硬件升级时,1GB的RAM是20美元/月,但是将整个服务器放在SSD上是10美元/月.虽然我知道从页面文件中读取总是比从RAM中读取要慢得多但我正在考虑在SSD上使用大页面文件而不是以两倍的价格购买1g的额外RAM - 再次,网站的速度不是关键,他们应该工作.这有什么意义吗?
我在Windows 2012 R2 Core框上运行IIS 8.5.我创建了一个名为"MyNewAppPool"的新应用程序池.我有一个名为"MyNewWebsite.com"的网站实例在"MyNewAppPool"应用程序池中运行.用于"MyNewAppPool"的标识是"ApplicationPoolIdentity".
我的理解是,我可以使用自动生成的本地虚拟帐户为IIS 8.5中的应用程序池分配安全权限,该帐户将命名为"IIS AppPool\{Application Pool Name}".
因此,在"MyNewWebsite.com"目录的Windows资源管理器中,我应该能够为虚拟用户帐户"IIS AppPool\MyNewAppPool"分配读/写权限.我找不到此用户帐户来分配任何权限.我正在搜索本地计算机位置而不是整个域.我可以找到"IIS应用程序池\默认应用"帐户,但是我不想给DefaultAppPPool下运行MyNewWebsite.com,我想给MyNewAppPool应用程序池下运行它.
谁能告诉我为什么我找不到MyNewAppPool自动生成的虚拟账户?
iis application-pool windows-server-2012 windows-server-2012-r2 iis-8.5
我们有一个ASP.NET MVC 4应用程序,它链接到传统的本机代码.问题是这个遗留代码具有在启动时构建的全局静态代码,但由于本机代码对App Domains一无所知,因此在重新加载App Domain时不会重新初始化该代码.在重新启动应用程序池进程之前,这会导致我们的应用程序中出现不正确的行为或崩溃.
因此,我想强制应用程序池在我们的应用程序的App Domain被回收时进行回收.IIS中是否有这样的设置,或者是否正在卸载域时我可以在我的应用程序中调用代码?
关于我的设置的一些信息,
更新
根据下面的答案,我连接到AppDomain卸载事件,并使用类似于以下的代码来回收应用程序池.
try
{
// Find the worker process running us and from that our AppPool
int pid = Process.GetCurrentProcess().Id;
var manager = new ServerManager();
WorkerProcess process = (from p in manager.WorkerProcesses where p.ProcessId == pid select p).FirstOrDefault();
// From the name, find the AppPool and recycle it
if ( process != null )
{
ApplicationPool pool = (from p in manager.ApplicationPools where p.Name == process.AppPoolName …Run Code Online (Sandbox Code Playgroud) 我有一个在IIS下托管的Web应用程序.它是一个数据仓库,在启动过程中需要在内存中实例化大量项目(大约需要20分钟才能完全设置).由于该网站对我们公司至关重要,因此该系统必须在白天100%在线,并且只能在下班时间重新启动.
出于某种原因,当一段时间没有使用时,这个Web应用程序似乎是"离线"的.我知道这一点,因为访问网站时缓存未完全实例化.这是无法接受的.
我不清楚为什么该网站被关闭.应用程序池仅设置为每天凌晨4:00(现在是上午11点)进行回收.
是否有其他设置,我不知道IIS部分导致它自动关闭网站?
Addl注意:在Visual Studio 中的IISExpress中运行时,网站不会自动关闭.只有IIS上托管的生产版本才会关闭.
这是运行网站的应用程序池的高级设置屏幕.(不确定它是否有用.)
我在IIS 7.5,Server 2008 R2上.它是一个ASP.NET 5 Web应用程序.