gpt4 book ai didi

asp.net - 在应用程序重新启动时清除临时 ASP.NET 文件

转载 作者:行者123 更新时间:2023-12-02 17:36:50 25 4
gpt4 key购买 nike

我们在启动时动态加载程序集并将它们添加为引用:

BuildManager.AddReferencedAssembly(assembly);

该应用程序支持在运行时安装新插件。在安装/卸载操作之后,我们将重新启动 Web 应用程序。我试过:

HostingEnvironment.InitiateShutdown();

System.Web.HttpRuntime.UnloadAppDomain();

但是,新版本的插件未加载 - 我相信这是由于 ASP.NET 积极缓存引用的程序集 - 特别是 ASP.NET MVC Controller 。

在生产中这应该不是问题,因为插件程序集版本每次都会增加。然而,在开发中这更是一个问题,因为我们不希望每次对插件进行轻微更改时都更改版本号。

我们如何以编程方式或使用构建后事件强制清除临时 asp.net 文件?

一种解决方案是“触摸”global.asax,但这对我来说似乎有点老套。

最佳答案

我使用了以下代码来按需重置应用程序池。 (只需将其连接到 Controller 操作)。

注意:由于它是应用程序池,因此您可能需要检查对同一应用程序池上运行的任何其他应用程序的影响。

public class IisManager
{
public static string GetCurrentApplicationPoolId()
{
// Application is not hosted on IIS
if (!AppDomain.CurrentDomain.FriendlyName.StartsWith("/LM/"))
return string.Empty;
// Application hosted on IIS that doesn't support App Pools, like 5.1
else if (!DirectoryEntry.Exists("IIS://Localhost/W3SVC/AppPools"))
return string.Empty;

string virtualDirPath = AppDomain.CurrentDomain.FriendlyName;
virtualDirPath = virtualDirPath.Substring(4);
int index = virtualDirPath.Length + 1;
index = virtualDirPath.LastIndexOf("-", index - 1, index - 1);
index = virtualDirPath.LastIndexOf("-", index - 1, index - 1);
virtualDirPath = "IIS://localhost/" + virtualDirPath.Remove(index);
var virtualDirEntry = new DirectoryEntry(virtualDirPath);
return virtualDirEntry.Properties["AppPoolId"].Value.ToString();
}


public static void RecycleApplicationPool(string appPoolId)
{
string appPoolPath = "IIS://localhost/W3SVC/AppPools/" + appPoolId;
var appPoolEntry = new DirectoryEntry(appPoolPath);
appPoolEntry.Invoke("Recycle");
}

public static void RecycleApplicationPool(string appPoolId, string username, string password)
{
string appPoolPath = "IIS://localhost/W3SVC/AppPools/" + appPoolId;
var appPoolEntry = new DirectoryEntry(appPoolPath, username, password);
appPoolEntry.Invoke("Recycle");
}

}

重写的方法是为了满足您想要显式传递对托管 IIS 实例的计算机/服务器具有管理员权限的用户的情况。

Controller 操作可能类似于;

 public string ResetAppPool()
{
var appPoolId = IisManager.GetCurrentApplicationPoolId();
if (appPoolId.Equals(string.Empty))
return "Application is not running inside an App Pool"; //May be not IIS 6 onwards
try
{
IisManager.RecycleApplicationPool(appPoolId); //Can only be used by Admin users
return string.Format("App pool {0} recycled successfully", appPoolId);
}
catch (Exception ex)
{
Logger.Error("Failed to recycle app pool : " + ex.StackTrace);
return string.Format("App pool {0} recycle failed", appPoolId);
}
}

关于asp.net - 在应用程序重新启动时清除临时 ASP.NET 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9785980/

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