ASP.Net Core应用在IIS Express可运行 部署到IIS后访问数据库报错
问题根因
你遇到的报错核心原因是IIS运行应用的身份权限和本地IIS Express不一致,结合error: 50 - 本地数据库运行时发生错误的提示,90%以上的场景是以下两种情况之一:
- 部署后生效的连接字符串用了
LocalDB开发版实例,LocalDB是用户级别的轻量实例,仅能被启动它的Windows用户访问,IIS默认的应用池内置账户没有权限加载LocalDB实例 - 连接字符串用了Windows认证方式访问SQL Server,IIS应用池的默认运行账户没有SQL Server的访问权限
解决方案
步骤1:确认生效的连接字符串
打开部署后站点根目录下的appsettings.json、appsettings.Production.json,检查PushNotificationContext对应的连接字符串:
- 如果数据源是
(LocalDB)\MSSQLLocalDB这类LocalDB地址,直接替换为正式SQL Server实例的连接地址,LocalDB不支持IIS生产部署场景 - 确认连接字符串没有被VS发布过程自动替换,和你之前正常运行的旧应用连接字符串完全一致
步骤2:配置IIS应用池权限
如果确认连接字符串指向正常的SQL Server实例,修改IIS应用池运行身份:
- 打开IIS管理器,找到站点对应的应用程序池,右键选择「高级设置」
- 找到「进程模型」分类下的「标识」选项,点击右侧的省略号按钮
- 可选修改方案二选一:
- 测试环境直接选择「内置账户」-「LocalSystem」,保存后重启应用池即可
- 生产环境选择「自定义账户」,设置为有SQL Server访问权限的Windows域账户/本地账户,或者后续在SQL Server中给默认应用池账户单独授权
步骤3:SQL Server权限配置(可选)
如果不想修改应用池默认标识,手动给IIS应用池账户授权:
- 打开SQL Server Management Studio,依次展开「安全性」-「登录名」,右键选择「新建登录名」
- 登录名输入格式为
IIS AppPool\你的应用池实际名称(注意不要搜,直接手动输入) - 切换到「用户映射」标签页,勾选你的业务数据库,授予
db_datareader、db_datawriter权限即可
额外排查点
如果以上操作都无效,检查以下配置:
- 打开SQL Server配置管理器,确认对应实例的TCP/IP协议已经启用
- 如果连接的是远程SQL Server实例,确认服务器防火墙开放了1433端口(命名实例额外开放1434 UDP端口)
- 确认SQL Server实例已经配置为允许远程连接
内容的提问来源于stack exchange,提问作者George Dim
相关产品推荐
相关产品推荐

