Windows Server 2019临时文件夹引发的Asp.Net Core框架异常

前言

最近,在服务器上发现Asp.Net Core经常提示如下异常,访问不了临时文件夹:.

Windows Server 2019临时文件夹引发的Asp.Net Core框架异常

可实际上,我们的代码并没有读写这个临时文件夹。

看错误堆栈,应该是框架本身抛出的异常。

解决方案

1.组策略

临时文件夹C:\Users\Administrator\AppData\Local\Temp\是肯定存在的。问题的原因主要是访问了\2\这个子目录。

在网上查找原因,说是远程桌面会为每个会话创建独立的临时文件夹,2应该是对应的会话ID。

于是,尝试使用组策略解决,不创建独立的临时文件夹:

Windows Server 2019临时文件夹引发的Asp.Net Core框架异常

结果发现,组策略并未起作用,\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,那就好办了!

于是创建了环境变量,目前为止,暂未出现问题:

Windows Server 2019临时文件夹引发的Asp.Net Core框架异常

结论

后来查到,造成问题的原因,是HttpRequestRewindExtensions.EnableBuffering 方法提供的特性:

确保 request Body 可以多次读取。通常会将请求正文缓冲到内存中;将大于30000字节的请求写入磁盘。

但是,我们并没有手工调用过此方法,而且仅在Server 2019上才出现问题。

如果你碰到同样异常,可照此处理。