0

我编写的 ASP.Net MVC3 应用程序有问题。该应用程序基本上由两个程序集组成,一个用于 UI 的 MVC3 应用程序和一个包含业务逻辑的基础结构 DLL。

基础设施程序集还引用了软件供应商提供的一些程序集,我认为这些程序集是封装了同一供应商提供的某些 COM 组件功能的互操作程序集。基础结构程序集对 Interop 程序集进行了多次调用,以执行我的应用程序的各种功能。

当我在我的开发机器(Win7)上的 Visual Studio 中运行 MVC 应用程序时,它运行良好。然后我将应用程序部署到预期的 Web 服务器(Win2k3R2 上的 IIS 6),它可以正常启动,并且大部分功能都可以正常工作。然而,对供应商程序集的调用之一失败,出现以下神秘异常:

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/etc。两台服务器上的配置相同。MVC 应用程序在此服务器上完美运行。

我已经尝试使用网络监视器和进程监视器进行调试,但没有出现任何明显的问题。

今天,我创建了一个控制台应用程序来练习基础结构程序集,从而将 ASP.Net 排除在外。控制台应用程序在我的开发机器和目标服务器上都能完美运行。

所以我的问题是:除了显而易见的,ASP.Net 和控制台应用程序之间的执行环境有什么区别?

我想到的一个是用户上下文。MVC 应用程序生成的日志的所有者是“网络服务”,但我显然是在自己的帐户下运行控制台应用程序。但是,这并不能解释两台服务器上的操作差异。

除了联系供应商(他们通常不太有帮助),我还应该看什么?

4

1 回答 1

1

这几乎可以肯定是一个权限问题。

您的堆栈跟踪引用了

Baa.Smarteam.SecurityManager

命名空间。正如您正确指出的那样,您的 MVC 应用程序作为 NETWORK SERVICE 运行(默认情况下),而您的控制台应用程序在您的登录帐户下运行(同样,默认情况下)。

如果在测试服务器上运行正常,那是因为运行“Baa”代码的必要权限已授予 NETWORK SERVICE,或者因为 MVC 应用程序没有在该机器上作为 NETWORK SERVICE 运行。

考虑“Baa”应用程序可能会尝试引用哪些安全资源(文件、注册表项等),并将工作服务器上这些资源的安全设置与发生故障的服务器上的设置进行比较。

于 2012-08-30T04:35:23.433 回答