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

时间:2017-05-14 19:28:16

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

我有一个小型的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的评论,我认为它已进一步缩小到内部MS数据库的某种权限问题。当我将网络应用更改为administrator而不是serviceQC帐户时,它可以毫无问题地访问数据库。

然而,这当然不是好习惯。我尝试在administrator s&#34;&#34;成员中添加所有组。 AD中的标签为serviceQC,但这没有任何帮助。有谁知道如何为特定用户授予 MSSQL $ MICROSOFT ## WID 数据库的访问权限?

1 个答案:

答案 0 :(得分:2)

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

Application Pool - &gt; Advanced Settings - &gt;的 Load User Profile

描述在哪里

  

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

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

奇怪的是,在将此更改为false之后(我需要确保这是原因),应用程序现在不再崩溃,而是从数据库中返回一个空List<Pallet>(它似乎不会抛出错误)。

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

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