【问题标题】:Application Crashes when Accessing Database访问数据库时应用程序崩溃
【发布时间】:2017-10-13 13:26:58
【问题描述】:

我有一个在我的 PC 上运行良好的小型 Web 应用程序,但是当我将它发布到服务器时,该应用程序在查询数据库时崩溃。

我已将范围缩小到这一行:

output = (List<Pallet>)db.Query<Pallet>(query, args);

我在哪里使用Dapper 来查询表。

通常,当发生错误时,它会将我带到共享的 ASP 错误页面,但在这里我只在 Chrome 中看到 This site can’t be reached ERR_CONNECTION_RESET

我还注意到在事件查看器中出现了一个应用程序错误,事件 ID 为 100

Faulting application name: w3wp.exe, version: 8.0.9200.16384, time stamp: 0x5010885f
Faulting module name: mso30win32client.dll, version: 16.0.4266.1001, time stamp: 0x55ba12f1
Exception code: 0xc0000005
Fault offset: 0x00088092
Faulting process id: 0x35a4
Faulting application start time: 0x01d2cce79551069b
Faulting application path: C:\Windows\SysWOW64\inetsrv\w3wp.exe
Faulting module path: C:\Program Files (x86)\Common Files\Microsoft Shared\Office16\mso30win32client.dll
Report Id: f044a40f-38da-11e7-9402-a4bf011a3e0b
Faulting package full name: 
Faulting package-relative application ID: 

这里是GrvController中的方法:

public ActionResult Details(string grvNumber)
{
    var pallets = access.GetPallets(grvNumber);

    var grv = new Grv(pallets);
    Session["grv"] = grv;

    return View(grv);
}

还有Access.GetPallets

internal List<Pallet> GetPallets(string grvNumber)
{
    using (var db = new OleDbConnection(ConnectionString))
    {
        var query = Constants.GetGrvQuery;
        var args = new DynamicParameters();
        args.Add("@grv", grvNumber);

        var output = new List<Pallet>();
        try
        {
            output = (List<Pallet>)db.Query<Pallet>(query, args);
        }
        catch (Exception e)
        {
            Log.Debug(e.Message);
        }
        return output;
    }
}

请注意,Exception e 永远不会被捕获,并且应用程序会在延迟后崩溃。

以前有人经历过吗?有谁知道我该如何调试这个?

提前致谢。


更新

我尝试更改我的 GetPallets 方法以查看问题是否特定于 Dapper,但在调用 OleDbConnection.Open() 时它正在做同样的事情。

我还注意到,在我的事件查看器中,这个应用程序错误的源源不断:

Login failed for user 'NT AUTHORITY\NETWORK SERVICE'. Reason: Could not find a login matching the name provided. [CLIENT: <named pipe>]

来源MSSQL$MICROSOFT##WID。莫非这有什么关系?

我的应用程序设置为使用在 AD 中创建的服务帐户。


更新 2

感谢 Austins cmets,我相信它已进一步缩小为内部 MS 数据库的某种权限问题。当我将网络应用程序更改为以administrator 而不是我的serviceQC 帐户运行时,它可以毫无问题地访问数据库。

但是,这当然不是好的做法。我尝试将AD中administrators“成员”选项卡中的所有组添加到serviceQC,但这没有帮助。有谁知道我如何授予特定用户访问 MSSQL$MICROSOFT##WID 数据库的权限?

【问题讨论】:

  • 立即引起注意的是 IIS 正在尝试将 32 位 dll 加载到它的地址空间中。 Visual Studio 是一个 32 位应用程序,这就是它工作的原因,IIS 默认为 64 位,尝试将应用程序池更改为 32 位,有关详细信息,请参阅以下链接。 help.webcontrolcenter.com/kb/a1114/…
  • @StuartSmith 我已经在应用程序池高级设置中将Enable 32-Bit Applications 设置为true,因为数据库是使用32 位访问构建的。你知道我是否需要在其他地方进行设置?
  • MSSQL$MICROSOFT##WID 是 Windows Server 上的内部 sql 数据库(作为 sqlservr.exe 运行)。根据您的更新,听起来您的服务帐户是问题所在。我最初的猜测是您的开发环境和本地 IIS 正在使用您的帐户运行,该帐户具有对主机的适当访问权限,而您的服务帐户没有。
  • @AustinDrenski 感谢您的评论。你对我如何测试这个有什么建议吗?我尝试将我的服务帐户 (serviceQC) 添加到管理员组,但结果相同
  • @AustinDrenski 我将服务帐户从serviceQC 更改为administrator,现在可以使用了!现在只需要弄清楚如何在不授予完整管理员权限的情况下授予对sqlservr 的访问权限...

标签: c# asp.net-mvc iis dapper windows-server-2012-r2


【解决方案1】:

搞砸了一段时间后,我在 IIS 中找到了以下选项

Application Pool -> Advanced Settings -> Load User Profile

描述在哪里

[loadUserProfile] 此设置指定 IIS 是否加载应用程序池标识的用户配置文件。当此值为 true 时,IIS 会加载应用程序池标识的用户配置文件。当您需要不为应用程序池标识加载用户配置文件的 IIS 6.0 行为时,将此值设置为 false。

将其设置为True 后,我的应用程序现在可以与数据库交互了。

奇怪的是,在将它改回 false 后(我需要确保这是原因),应用程序现在不再崩溃,而是从数据库中返回一个空的 List&lt;Pallet&gt;(它似乎没有抛出错误)。

我发现this answer 对正在发生的事情做了一些解释,但正如其中一位 cmets 所提到的,设置此选项可能会对安全性和性能产生一些影响。

我假设必须有其他方法来解决我的问题,但现在必须这样做。

【讨论】:

  • 感谢您的修复。它解决了我在 IIS 中使用 Access DAO 时的问题。将 Load User Profile 设置为 true 可以阻止 IIS 工作进程在访问数据库后不久崩溃的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
相关资源
最近更新 更多