0

谁能解释一下 MVC 如何处理请求?我有一个 MVC Web 应用程序,在我尝试检查哪个 AppDomain 运行每个请求之前,我遇到了一些问题。发生了一件奇怪的事情(对我来说),有时它会在一个 AppDomain 中创建控制器,有时在另一个 AppDomain 中创建控制器。我将 AppDomain.CurrentDomain.GetHashCode() 添加到控制器的构造函数中,并且不同请求的值不同。(但不是每个请求,有时该值已被使用)这意味着它以某种方式在另一个中创建和运行控制器应用程序域。

我使用 Visual Studio 2010 开发 Web 服务器进行调试。

这里有一个调用栈: 调用堆栈到控制器

事实上有 Appdomain Transition 并且我的代码在不同的 AppDomains 中运行它肯定会创建不同的 AppDomains,但是我该如何控制呢?我对这件事不是很有经验,所以有人可以给我一些建议如何改变吗?我需要我的代码在一个 AppDomain 中运行。

谢谢你。

更新 1:这可能有点令人困惑,我的意思是我的代码在 MVC 中的不同 AppDomain 中运行,但 WebServer 创建 AppDomain 并将对 MVC 的调用包装在其中。那么,为什么会这样呢?谁能解释一下?

更新 2:我发现并发布了为什么它会在每个请求中创建 AppDomain。我们通过名为“PEngine”的 C++ 库的 DllImport 管理了内部使用非托管方法“Process”的 C# dll“PEngineCSharp”。

在我的控制器中,我有几种方法,其中一种是“PEngineProcess”,该方法的调用方式如下:

PEngineCSharp.PEngine.Process(ProcessInfo info);

每次调用控制器的“PEngineProcess”方法后,每个请求都在单独的 AppDomain 中启动。如果我不调用此方法,而是调用其他方法,那么它们都是纯托管的,它们都在一个 AppDomain 中运行。在评论调用“PEngineCSharp.PEngine.Process(ProcessInfo info);”之后 对控制器方法“PEngineProcess”的调用不会创建新的 AppDomain,并且所有内容都在一个 AppDomain 中运行。为了测试,我刚刚添加了“PEngineCSharp.PEngine.Process(ProcessInfo info);” 到另一个控制器的方法,然后请求开始在新的 AppDomains 中重新开始。所以我找到了这种行为的原因,我也尝试了 VisualStudio WebServer、IIS Express 7.5 和 IIS 7.0 上的所有东西——所有这些行为都是一样的。

拜托,谁能解释一下那里发生了什么?谢谢!

4

0 回答 0