前言
最近,在服务器上发现Asp.Net Core经常提示如下异常,访问不了临时文件夹:.
可实际上,我们的代码并没有读写这个临时文件夹。
看错误堆栈,应该是框架本身抛出的异常。
解决方案
1.组策略
临时文件夹C:\Users\Administrator\AppData\Local\Temp\
是肯定存在的。问题的原因主要是访问了\2\
这个子目录。
在网上查找原因,说是远程桌面会为每个会话创建独立的临时文件夹,2
应该是对应的会话ID。
于是,尝试使用组策略解决,不创建独立的临时文件夹:
结果发现,组策略并未起作用,\2\
子目录还是创建了,而且该目录还会不定时被删除,即使设置了在退出时不删除临时文件夹也没有用。
2.环境变量
没有办法,只有根据错误堆栈的提示,直接看AspNetCoreTempDirectory源码[1],看看能否找到问题原因。
TempDirectory属性的实现代码如下:
public static string TempDirectory
{
get
{
if (_tempDirectory == null)
{
// Look for folders in the following order.
var temp = Environment.GetEnvironmentVariable("ASPNETCORE_TEMP") ?? // ASPNETCORE_TEMP - User set temporary location.
Path.GetTempPath(); // Fall back.
if (!Directory.Exists(temp))
{
throw new DirectoryNotFoundException(temp);
}
_tempDirectory = temp;
}
return _tempDirectory;
}
}
嗯,有读取环境变量ASPNETCORE_TEMP,那就好办了!
于是创建了环境变量,目前为止,暂未出现问题:
结论
后来查到,造成问题的原因,是HttpRequestRewindExtensions.EnableBuffering 方法提供的特性:
确保 request Body 可以多次读取。通常会将请求正文缓冲到内存中;将大于30000字节的请求写入磁盘。
但是,我们并没有手工调用过此方法,而且仅在Server 2019上才出现问题。
如果你碰到同样异常,可照此处理。