说实话,我试图在IIS上变成一个肮脏的把戏,当我认为我要逃避它时,我意识到我的解决方法不起作用.这是我试图做的事情:
1)我有ASP.NET应用程序,它具有继承IProcessHostPreloadClient的Preloader类,并在Preload方法实现中完成所有繁重的初始化(应用程序很复杂,并且它是庞大系统的一部分,所以它需要大约2分钟来建立所有必要的连接服务并预先实例化一些Unity注册).
2)我需要在应用程序关闭(取消订阅,断开连接,处理......)上完成大量工作,我想最好的地方是位于Global.asax中的*Application_End*方法.
3)当我有用户活动时,一切正常工作(包含上述Web应用程序的应用程序池启动后的第一个请求将导致*Application_Start*被调用,之后*Application_End*在应用程序池停止或回收时调用),但问题当没有用户活动且应用程序在激活48小时后尝试重新启动时发生(配置的要求).由于没有请求,申请正式没有开始.因此,它不能被优雅地停止,因为*Application_End*将不会被调用.
4)现在出现了凌乱的部分......我试图在Preload方法结束时从代码中发出GET请求,并且它有效.但这个解决方案对我来说似乎很糟糕,尽管它有效.所以,我尝试了很多东西,我尝试的最后一件事是:
SimpleWorkerRequest swr = new SimpleWorkerRequest(string.Empty, string.Empty, tw);
HttpRuntime.ProcessRequest(swr);
Run Code Online (Sandbox Code Playgroud)
......这就是它的目的.*调用Application_Start*,(我已经检查了响应,它包含了应该在初始请求中显示的登录页面),并且应用程序池关闭应用程序通过在*Application_End*中执行必要的工作而正常结束.
但
在以这种方式启动(预加载和启动)应用程序之后,当我想通过Web浏览器访问应用程序时会发生这种情况:
HTTP错误500.21 - 内部服务器错误处理程序"ExtensionlessUrlHandler-Integrated-4.0"在其模块列表中有一个错误的模块"ManagedPipelineHandler"
我无法弄清楚这一点.谁能告诉我为什么会发生这种情况以及如何解决这个问题?
如果我不知道这一点,我将回到第一个解决方案(从代码发送GET请求),但这一问题将错误我,因为我甚至不有一个想法,什么是错的.
我一直在读Joseph Albahari关于线程的这本书:http:
//www.albahari.com/threading/
在第2部分中,我找到了这个例子:http:
//www.albahari.com/threading/part2.aspx#_When_to_Lock
以下是上述示例:
class ThreadUnsafe
{
static int _x;
static void Increment() { _x++; }
static void Assign() { _x = 123; }
}
Run Code Online (Sandbox Code Playgroud)
线程安全版本:
class ThreadSafe
{
static readonly object _locker = new object();
static int _x;
static void Increment() { lock (_locker) _x++; }
static void Assign() { lock (_locker) _x = 123; }
}
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么Assign方法不是线程安全的.在32位和64位架构上,整数赋值不应该是原子操作吗?
我正在尝试创建类似于MVC的Area的ItemTemplate。无论如何,我无法在TemplateContent中创建一个包含TargetFolderName和参数的文件夹。这是我的TemplateContent部分的简化示例:
<TemplateContent>
<Folder Name="Area" TargetFolderName="$AreaName$">
<ProjectItem ReplaceParameters="true" TargetFileName="$AreaName$Controller.cs">Controller.cs</ProjectItem>
</Folder>
</TemplateContent>
Run Code Online (Sandbox Code Playgroud)
即使MSDN指出TargetFolderName为
对于使用参数替换来创建文件夹名称或使用无法在.zip文件中直接使用的国际字符串命名文件夹很有用。
尽管如此,我还是无法完成这项工作。
输入“ TestArea ”的预期结果:
TestArea
|__ TestAreaController.cs
Run Code Online (Sandbox Code Playgroud)
实际结果:
$AreaName$
|__ TestAreaController.cs
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
提前致谢。