Umbraco媒体服务内存不足异常,但文件已上载



我添加了hangfire来处理我的文件上传到媒体文件夹作为后台处理。现在我的后台进程是上传1GB以上的文件大小。现在,如果文件低于1GB,它可以正常工作,但超过1GB,当它运行此代码ApplicationContext.Current.Services.MediaService.Save(media);时,我会收到SystemOutOfMemoryException。现在我假设它确实无法在media文件夹中创建文件,但在检查该文件夹时,它能够成功地将文件移动到该文件夹,这只是抛出了一个内存系统异常,并且当我登录到CMS时,我看不到新文件->媒体页面。我不知道该怎么办,因为不管文件处理是否成功,问题都会出现——它成功地创建了Media文件夹。现在,在我的代码中,它会假设它因为异常而失败,所以它会尝试再次重新处理文件,这将重复并占用内存空间。

现在我的问题是

  1. 当它实际上成功地将文件移动到介质文件夹时,为什么会给出SystemOutOfMemoryException
  2. 由于它未能完成该过程,但成功地将文件移动到了正确的媒体目录(具有正确的autoid(,我如何手动将条目插入数据库以使其显示在CMS中

非常感谢您的帮助。下面是我的代码

public string process()
{
string[] filePaths = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory + "uploads");
string lastFileName = "";
foreach (string filePath in filePaths)
{
if (this.IsFileLocked(filePath)) {
continue;
}
try
{
using (Stream stream = System.IO.File.OpenRead(filePath))
{
string filename = Path.GetFileName(filePath);
lastFileName = filename;
//Constants.Conventions.MediaTypes.Image
string mediaType = Constants.Conventions.MediaTypes.File;
string ext = Path.GetExtension(filename);
if (ext == ".jpg" || ext == ".png" || ext == ".gif" || ext == ".jpeg")
{
mediaType = Constants.Conventions.MediaTypes.Image;
}
HttpContext.Current = new HttpContext(new HttpRequest(null, "https://www.google.com", null), new HttpResponse(null));
IMedia media = ApplicationContext.Current.Services.MediaService.CreateMedia(filename, Constants.System.Root, mediaType);
//IMedia media = Services.MediaService.CreateMedia(filename, Constants.System.Root, mediaType);
media.SetValue("umbracoFile", filename, stream);
// Save the media
ApplicationContext.Current.Services.MediaService.Save(media);
media = null;
}
System.IO.File.Delete(filePath);
Console.WriteLine($"{filePath} is deleted.");
break;
} catch (Exception e)  {
Console.WriteLine($"{filePath} failed to process." + e.Message);
return filePath + " failed to process " + e.Message;                    
}
}
return lastFileName + " Process successful!";
}

注意:这个函数是由hangfire后台作业调用的,这就是我模拟HttpContext的原因

我的猜测是,如果这是一张图像,那么它在为后台生成图像缩略图时会失败。1GB是一个上传到网站的相当大的图像,调整其大小以生成缩略图可能会占用大量内存。

也就是说,我有一个CMS使用的网站上传1GB以上的图像很好,但它托管在一台有很多RAM的机器上,所以在内存不足的情况下运行它需要一些时间。

你使用的是什么版本的Umbraco,托管它的机器的规格是什么?

好吧,经过数周的努力,我发现了问题所在,并试图将服务器配置为处理大文件。事实证明,服务器配置和我的本地开发足以处理大文件。问题来自这条

ApplicationContext.Current.Services.MediaService.Save(media)

似乎我不确定幕后发生了什么,但对于这种代码,它只适用于1GB以下的文件(我没有足够的证据支持这一点(。但当我检查其他可用参数时,它有其他覆盖,低于

int user_id = 1;
int showError = false;
ApplicationContext.Current.Services.MediaService.Save(media, user_id, showError);

因此,在此基础上,我可以传递另外两个参数:User_id和ShowError。所以基本上我的猜测是,它试图找到上传文件的user_id,但默认情况下,由于我使用的是后台服务,它没有user_id凭据;也许"它试图找出谁是真正的loggedin用户,但找不到,因为这是一个后台服务请求。然后是第三个选项,即ShowError。默认情况下,它被设置为True,因此当它没有遇到user_id或可能耗尽了它的保留内存试图重试计算user_id时,它会抛出SystemOutOfMemory异常。

现在我实际上无法证明我的";猜测"实际上是正确的,但一旦我添加了这2个参数,它就可以成功保存,甚至不需要2秒钟就可以处理1GB以上的文件。

如果它实际在做什么,请随时评论MediaService.Save(media)功能。

注意:我的请求来自Hangfire触发的后台服务。当我添加2个可选参数,即UPLOADER/USERID和SHOWERROR 时,我没有遇到错误

相关内容

  • 没有找到相关文章

最新更新