在IIS上托管.NET Core 2.1时遇路径访问拒绝问题求助
针对你的.NET Core 2.1 Web API部署问题的解决方案
Let's break down your three distinct issues and walk through actionable fixes for each scenario:
1. 解决IIS环境下的UnauthorizedAccessException(路径访问被拒绝)
你提到已经给应用池分配了权限,但可能存在几个容易忽略的细节:
- 确认应用池身份的权限范围:如果你的应用池使用的是默认的
ApplicationPoolIdentity,需要给IIS AppPool\[你的应用池名称]这个特定身份分配R:\SoftCatWebApi\ETL目录的读取+写入权限(NLog需要写入日志,仅读取不够)。同时要检查父目录R:\SoftCatWebApi的权限是否允许子目录继承权限,或者直接给父目录也加上该身份的权限。 - 排查网络映射盘的权限问题:如果R盘是网络映射驱动器,IIS应用池的本地身份(比如
ApplicationPoolIdentity)无法访问网络共享。这时可以:- 改用UNC路径(比如
\\文件服务器IP\共享名\SoftCatWebApi\ETL)替换映射盘路径; - 把应用池身份改为拥有网络共享访问权限的域账户或专用服务账户,同时在应用池高级设置里开启
Load User Profile为True。
- 改用UNC路径(比如
- 验证NLog配置的准确性:检查NLog配置文件中指定的日志输出路径是否正确,是否确实指向了
R:\SoftCatWebApi\ETL,避免因路径拼写错误导致的权限问题。
2. 解决CMD直接运行dll时的FileNotFoundException(找不到System.Runtime)
这个问题核心是.NET Core运行时环境缺失或不完整:
- 安装正确的Windows Hosting Bundle:确保生产服务器安装了.NET Core 2.1的Windows Hosting Bundle(不是单独的Runtime或SDK),这个包包含了ASP.NET Core模块和完整的运行时依赖,是部署IIS托管的.NET Core应用的必备组件。
- 检查部署模式:如果是框架依赖部署,必须保证服务器已安装对应版本的.NET Core Runtime;如果是自包含部署,重新发布时要确保勾选了“自包含”选项,并且发布过程没有报错,目标目录包含所有依赖文件。
- 重新发布并清理目标目录:尝试删除生产服务器上的旧部署文件,重新从开发环境发布一次,避免因文件缺失或损坏导致的依赖加载失败。
3. 解决IIS管理器中web.config相关错误
这类错误通常和ASP.NET Core模块配置或web.config语法有关:
- 验证web.config的ASP.NET Core节点配置:确认
<aspNetCore>节点的processPath和arguments参数正确:
如果是自包含部署,<aspNetCore processPath="dotnet" arguments=".\ETL.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />processPath应该指向你的exe文件(比如.\ETL.exe)。 - 检查web.config的XML语法:用XML验证工具检查web.config是否存在标签未闭合、非法字符等语法错误,这类问题会导致IIS无法解析配置。
- 确认ASP.NET Core模块已安装:如果之前没装Windows Hosting Bundle,IIS中没有ASP.NET Core模块,会直接报web.config相关错误,安装Hosting Bundle后需要重启IIS生效。
额外排查技巧
- 启用详细日志:在web.config的
<aspNetCore>节点中开启stdoutLogEnabled="true",指定日志路径,查看生成的日志文件,获取更精准的错误信息。 - 查看Windows事件查看器:在事件查看器的“应用程序日志”中查找相关错误条目,里面会包含更多关于权限、加载失败的细节。
内容的提问来源于stack exchange,提问作者Hawkzey
相关产品推荐
相关产品推荐

