【发布时间】: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