0
点赞
收藏
分享

微信扫一扫

临时文件夹引发的Asp.Net Core框架异常 #yyds干货盘点#

前言

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

临时文件夹引发的Asp.Net Core框架异常 #yyds干货盘点#_环境变量

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

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

解决方案

1.组策略

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

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

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

临时文件夹引发的Asp.Net Core框架异常 #yyds干货盘点#_microsoft_02

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

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

临时文件夹引发的Asp.Net Core框架异常 #yyds干货盘点#_环境变量_03

结论

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

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

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

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

参考资料

[1]

AspNetCoreTempDirectory源码: ​​​https://github.com/dotnet/aspnetcore/blob/main/src/Http/WebUtilities/src/AspNetCoreTempDirectory.cs​​

[2]

HttpRequestRewindExtensions.EnableBuffering 方法: ​​​https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.http.httprequestrewindextensions.enablebuffering​​

想了解更多内容,请关注我的个人公众号”My IO“

临时文件夹引发的Asp.Net Core框架异常 #yyds干货盘点#_microsoft_04

举报

相关推荐

0 条评论