我有一个小型的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中创建的服务帐户。
感谢Austins的评论,我认为它已进一步缩小到内部MS数据库的某种权限问题。当我将网络应用更改为administrator
而不是serviceQC
帐户时,它可以毫无问题地访问数据库。
然而,这当然不是好习惯。我尝试在administrator
s&#34;&#34;成员中添加所有组。 AD中的标签为serviceQC
,但这没有任何帮助。有谁知道如何为特定用户授予 MSSQL $ MICROSOFT ## WID 数据库的访问权限?
答案 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会对正在发生的事情做一些解释,但正如其中一条评论所提到的那样,设置此选项可能会带来一些安全性和性能影响。
我假设必须有其他方法来解决我的问题,但现在必须这样做。