访问数据库时应用程序崩溃

Application Crashes when Accessing Database

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

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

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

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

通常当发生错误时,它会将我带到共享的 ASP 错误页面,但在这里我只是在 Chrome.[=29 中得到一个 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 的评论,我相信它已进一步缩小为内部 MS 数据库的某种权限问题。当我将网络应用程序更改为 运行 作为 administrator 而不是我的 serviceQC 帐户时,它可以毫无问题地访问数据库。

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

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

Application Pool -> Advanced Settings -> Load User Profile

描述在哪里

[loadUserProfile] This setting specifies whether IIS loads the user profile for an application pool identity. When this value is true, IIS loads the user profile for the application pool identity. Set this value to false when you require the IIS 6.0 behavior of not loading the user profile for the application pool identity.

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

奇怪的是,在将其改回 false 后(我需要确保这是原因),应用程序现在不再崩溃,而是 returns 来自数据库的空 List<Pallet> (它似乎没有抛出错误)。

我发现 this answer 对正在发生的事情做了一些解释,但正如评论中提到的那样,设置此选项可能对安全和性能有一些影响。

我假设一定有其他方法可以解决我的问题,但目前只能这样做。