我遇到了我编写的ASP.Net MVC3应用程序的问题。该应用程序基本上由两个程序集组成,一个用于UI的MVC3应用程序,以及一个包含业务逻辑的Infrastructure DLL。
基础结构程序集还引用了软件供应商提供的一些程序集,我相信Interop程序集包含了同一供应商提供的某些COM组件的功能。 Infrastructure asembly会对Interop程序集进行大量调用,以执行我的应用程序的各种功能。
当我在我的开发机器(Win7)上运行Visual Studio中的MVC应用程序时,它运行得很好。然后我将应用程序部署到预期的Web服务器(Win2k3R2上的IIS 6),它启动正常,大多数功能都可以工作。然而,对Vendor集合的调用之一失败了,其中有以下神秘的例外:
System.Runtime.InteropServices.COMException: Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
at SmarTeam.Std.Interop.SmarTeam.SmApplic.ISmObject.InsertEx2(ISmBehavior Behavior)
at Baa.Smarteam.SecurityManager.Infrastructure.Smarteam.SmarteamAccountRepository.Create(UserAccountFromST smarteamAccount)
--- End of inner exception stack trace ---
at Baa.Smarteam.SecurityManager.Infrastructure.Smarteam.SmarteamAccountRepository.Create(UserAccountFromST smarteamAccount)
at Baa.Smarteam.SecurityManager.Infrastructure.UserAccountRepository.Create(IDualSourceUserAccount userAccount)
at Baa.Smarteam.SecurityManager.Infrastructure.UserManager.CreateUser(Int32 bemsId)
at Baa.Smarteam.SecurityManager.Web.Controllers.UserController.ProcessAction(Nullable`1 id, String actionName, Func`2 action)
奇怪的是,Interop程序集中的所有其他调用都可以正常工作。只是这个失败了。
我还在我们的测试环境中将我的MVC应用程序发送到供应商应用程序的Web服务器上。据我所知,OS / IIS / .Net /等。两台服务器上的配置相同。 MVC应用程序在此服务器上运行良好。
我已尝试使用网络监视器和进程监视器进行调试,但没有任何明显的显示。
今天我创建了一个控制台应用程序,用于运行基础架构程序集,使ASP.Net脱离等式。控制台应用程序可以在我的开发计算机上以及目标服务器上完美运行。
所以我的问题:除了显而易见的,ASP.Net和控制台应用程序之间的执行环境有什么不同?
我想到的是用户上下文。 MVC应用程序生成的日志的所有者是“网络服务”,但我显然是在自己的帐户下运行控制台应用程序。但这并没有解释两台服务器上的操作差异。
除了联系供应商(通常不太有帮助)之外,我还应该关注什么呢?
答案 0 :(得分:1)
这几乎肯定是一个许可问题。
您的堆栈跟踪引用
中的类Baa.Smarteam.SecurityManager
命名空间。正如您正确指出的那样,您的MVC应用程序作为NETWORK SERVICE运行(默认情况下),而您的控制台应用程序在您的登录帐户下运行(默认情况下)。
如果在测试服务器上有效,那是因为已经向NETWORK SERVICE授予了运行“Baa”代码的必要权限,或者因为MVC应用不作为NETWORK SERVICE运行那个盒子。
考虑“Baa”应用程序可能尝试引用哪些安全资源(文件,注册表项,...),并将工作服务器上这些资源的安全设置与失败的服务器上的设置进行比较。