0

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

    2023.06.06 | admin | 129次围观

    前言

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

    可实际上下载失败 临时文件或其所在磁盘不可写,我们的代码并没有读写这个临时文件夹。

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

    解决方案1.组策略

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

    在网上查找原因下载失败 临时文件或其所在磁盘不可写,说是远程桌面会为每个会话创建独立的临时文件夹,2应该是对应的会话ID。

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

    结果发现,组策略并未起作用,\2\子目录还是创建了,而且该目录还会不定时被删除,即使设置了在退出时不删除临时文件夹也没有用。

    2.环境变量

    没有办法,只有根据错误堆栈的提示,直接看AspNetCoreTempDirectory源码[1],看看能否找到问题原因。

    TempDirectory属性的实现代码如下:

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

    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 方法[2]提供的特性:

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

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

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

    参考资料

    [1]

    AspNetCoreTempDirectory源码:

    [2]

    HttpRequestRewindExtensions.EnableBuffering 方法:

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论