IIS上部署Baget,执行dotnet nuget push命令500异常(Access to the path is denied.)

异常案例

在Visual Studio 2022中以IIS Server或Kestrel作为Web Server启动的情况下,执行dotnet nuget push命令正常。

但是当部署到本机的IIS上后,执行对应命令出现500异常,具体异常如下图所示。

解决方案

经过问题排查发现是IIS没有系统临时文件夹的访问跟读写权限导致(ps:可能您遇到的问题并不是这个原因导致)。

于是便根据C:\Windows\Temp路径给Temp文件夹添加IIS_IUSRS用户组对应的权限即可,具体步骤选中Temp文件夹>右键点击属性>安全>编辑>添加IIS_IUSRS用户组>勾选授予对应权限>应用后确定,重新执行dotnet nuget push命令后成功,可以正常推送包源。

解决过程

执行dotnet nuget push命令出现异常后,首先要找到异常信息确认是什么原因导致的,于是便打开Windows的事件查看器,找到Windows日志下的应用程序,通过其抛出的异常类型(System.UnauthorizedAccessException)以及给出的异常信息(Access to the path is denied.)可以确定是文件授权问题,访问被拒绝,具体异常信息如下图所示。

知道了是没有对应文件或文件夹的权限导致,那么到底是哪个文件或文件夹没有权限呢?

根据异常中的堆栈信息可以在项目中找到对应异常方法以及执行代码,可以看到是Path.GetTemFileName()这个方法抛出的异常(如下图所示),该方法的作用主要是在系统临时文件夹中创建.tmp临时文件并返回完整的路径,所以可以定位到是临时文件夹这块的访问、读写权限问题。

在这之前一直有个疑问,为什么在Visual Studio 2022中调试时执行dotnet nuget push命令时都是正常的,而部署到本机IIS上时就会有这种文件权限异常呢?

通过调试可以看到其具体访问的路径(如下图所示),于是找到C:\[Users|用户]\[你的用户名]\AppData\Local\Temp文件夹,给其授予对应权限。

结果你就会发现了,依旧不行,还是会有500异常并且是相同异常信息。

最后在网上搜索并对比了一些案例,发现还有一个系统临时文件夹C:\Windows\Temp,于是尝试给其也授予IIS_IUSRS用户组对应的权限,再次执行命令后发现推送包成功了,也看到了所创建的.tmp文件(如下图所示)。

个人分析应该是在Visual Studio 2022中调试时程序所访问的是用户临时文件夹(User's Temp folder),而部署到IIS时访问的则是系统临时文件夹(System Temp folder),由于没有系统临时文件夹的访问读写权限,所以导致在Visual Studio 2022中调试时正常,部署到IIS上时就会出现访问权限异常。

访问本机IIS服务器中部署的Baget地址,可以看到包已经被正常上传上去了(如下图所示)。

 

至此就结束了,希望以上内容对您有所帮助,如文中描述有误或者您有其它看法,还望在评论区指正或讨论。

END

 

posted @ 2023-11-29 10:07  AND1云梯  阅读(298)  评论(0)    收藏  举报