Threading.Timer文件创建问题

时间:2014-01-17 19:34:43

标签: asp.net-mvc multithreading thread-safety imageresizer

我有一个中等信任级别的主机,我使用imageresizer nuget包为我的图像处理。因此,当我尝试使用ImageBuilder.Build时,我收到了这个错误:

    Access to the path '(path)' is denied.
System.UnauthorizedAccessException: Access to the path '(path)' is denied.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
   at ImageResizer.ImageBuilder.BuildJob(ImageJob job)
   at ImageResizer.ImageBuilder.Build(ImageJob job)
   at ImageResizer.ImageBuilder.Build(Object source, Object dest, ResizeSettings settings, Boolean disposeSource, Boolean addFileExtension)
   at ImageResizer.ImageBuilder.Build(Object source, Object dest, ResizeSettings settings, Boolean disposeSource)
   at _10oy.UI.Web.Imager.Models.Downloader.SaveAndSetDimension(String path, Int32 width, Int32 height)

btw :(路径)由我编辑。

我研究错误但我没有找到任何有效的结果。

这是我的代码(我在threading.timer中调用它,它可能会出问题吗?)

    public void SaveAndSetDimension(string path, int width, int height)
    {
        try
        {
            ImageBuilder.Current.Build(_MainStream, path, new ResizeSettings() { MaxWidth = width, MaxHeight = height }, false);
        }
        catch (Exception ex)
        {
            Results.Failed++;
            DAL.Classes.Log.Write(
            message: ex.Message,
            innerexcepition: ex.InnerException != null ? ex.InnerException.ToString() : ex.ToString(),
            user: "Saver",
            interfaces: 4 //Imager
            );
        }
    }

我尝试了常规文件创建动作

    public ContentResult CreateFile()
    {
        System.IO.File.Create(Server.MapPath("~/myfile.txt"));

        return Content("File Created");
    }

及其工作。

感谢。

编辑:当我在正常操作中调用它时效果很好,但是当调用计时器时我得到了这个错误。

2 个答案:

答案 0 :(得分:1)

我找到了。线程使用另一个Windows标识,因为它无法创建文件或删除或任何东西。我这样解决了;

从这样的application_start等获取身份。

        identity = System.Security.Principal.WindowsIdentity.GetCurrent();

之后,在文件处理之前调用它

        identity.Impersonate();

它有效。

答案 1 :(得分:0)

你说你是从计时器中调用它的 - 你是否有可能在之前运行的计时器?尝试确保每次运行计时器时都使用唯一的文件,以验证程序是否未将文件锁定在自身。