发布MVC后Ajax请求无法访问控制器,报500内部服务器错误
兄弟,这种开发环境跑的溜、一上服务器就报500的坑我踩过不下十次!别着急瞎搜了,咱们按优先级一步步排查,大概率是配置或环境适配的问题:
第一步:先解锁具体错误信息
默认情况下IIS会把500错误的细节藏起来,你得先让它显示出来。打开发布后的web.config,做两处修改:- 在
<system.web>节点下添加:<customErrors mode="Off"/> - 在
<system.webServer>节点下添加:<httpErrors errorMode="Detailed"/>
改完后刷新页面,就能看到具体的错误提示了——这是所有排查的基础,不然全靠瞎猜效率太低。
- 在
第二步:检查服务器的.NET Framework环境
你用VS2015开发的MVC应用,大概率依赖的是.NET Framework 4.5.x或4.6.x,先确认服务器上有没有安装对应的框架版本。如果服务器上的版本比你开发时用的低,直接就会炸。第三步:核对依赖项的“复制本地”设置
开发环境里的NuGet包,服务器上不一定有。右键你项目里的所有引用,查看属性里的复制本地选项,把那些非系统自带的第三方库(比如你用的日志组件、ORM框架等)都设为True,这样发布时才会把这些dll一起传到服务器上。第四步:排查权限问题
这个是重灾区!- 检查应用程序池的身份:默认的
ApplicationPoolIdentity权限很低,试试临时把它改成LocalSystem,如果错误消失了,说明是权限不足。之后再给应用池身份分配具体的权限(比如网站目录的读写权限、数据库的访问权限)。 - 如果你有文件上传、读写App_Data文件夹的逻辑,一定要确保服务器上对应的目录有写入权限。
- 检查应用程序池的身份:默认的
第五步:检查配置文件的发布替换
发布时有没有把web.config里的连接字符串、AppSettings换成生产环境的?比如开发时用的是本地SQL Server,生产环境是远程数据库,连接字符串写错了直接就会触发数据库连接错误导致500。另外,有些自定义配置项是不是在发布时被覆盖或者遗漏了?第六步:试试关闭预编译发布
如果你发布时选了“预编译”,有时候视图里的语法错误在开发环境运行时不会暴露,但预编译时就会报错。可以临时改成“不预编译”发布,看看问题是否消失,如果好了,再去排查视图里的隐藏错误。
先按这个顺序来,拿到具体错误信息后,问题就好定位多了!
内容的提问来源于stack exchange,提问作者MrKrantz

