【问题标题】:ASP.NET Core download from a Network Share (sometimes works?)从网络共享下载 ASP.NET Core(有时有效?)
【发布时间】:2020-02-14 20:27:50
【问题描述】:

我有一个非常标准的 ASP.NET Core 2.2 Web 应用程序。 我在下载存储在网络共享上的文件时遇到问题。我们在代码中使用模拟方法(客户要求)来访问文件共享。使用提供的凭据上传到共享工作正常,因此我们知道 (a) 模拟工作正常,并且 (b) 文件位于目标位置。我遇到的问题来自下载文件。这是一个非常标准的下载链接,它指向控制器中的一个操作,该操作从数据库中获取文件信息并使用两个数据库值(PathToFile 和 Filename)来获取文件的位置并将其拉回控制器,然后通过返回一个文件:

        var fileRecord = //Get the record from the database.

        byte[] bytes = null;
        if(fileRecord != null)
        {
            try
            {
                string fullPath = $"{fileRecord.PathToFile}\\{fileRecord.Filename}";

                await ImpersonationHelper.Impersonate(async () => { bytes = await System.IO.File.ReadAllBytesAsync(fullPath); }, _settings);

            }
            catch (Exception e)
            {
                return NotFound();
            }
        }

        return File(bytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileRecord.Filename);

供参考:

    public static async Task Impersonate(Action actionToExecute, ApplicationSettings settings)
    {
        IntPtr tokenHandle = new IntPtr(0);

        SafeAccessTokenHandle safeAccessTokenHandle = null;

        ImpersonateLogin login = new ImpersonateLogin(settings);

        Task<bool> returnValue = Task.Run(() => LogonUser(login.username, login.domain, login.password, 2, 0, out safeAccessTokenHandle));

        if (false == returnValue.Result)
        {
            int ret = Marshal.GetLastWin32Error();
            throw new System.ComponentModel.Win32Exception(ret);
        }

        if(safeAccessTokenHandle != null)
        await returnValue.ContinueWith(antecedent => WindowsIdentity.RunImpersonated(safeAccessTokenHandle, () =>
        {
            actionToExecute();
        }));
    }
}

在本地,它运行良好(我们跳过了应用设置的模拟),文件返回并设置为浏览器中的下载。

但是,在服务器上,它不起作用,但它也起作用。奇怪:点击链接会出现错误页面:

但是一遍又一遍地刷新这个错误页面(即重新请求该文件)会使其正常工作(通常每 2-4 次刷新将正确返回文件)。

有没有人遇到过这种情况,或者类似的事情可以提供一些见解?

【问题讨论】:

    标签: c# asp.net-core


    【解决方案1】:

    事实证明,它(似乎?)与异步方法有关。 一旦我删除了对模拟的(强制)异步调用,以及所有对“下载”操作的异步调用,它们现在都排成一行,并且现在 100% 的时间都在工作。从我在网上可以找到的内容来看,这似乎是异步/同步调用的“时间”问题。模拟将在下载文件之后发生,因此用户无权实际获取要下载的文件,但在某些情况下,模拟会首先发生,因此文件会返回。让一切都“非异步”解决了我遇到的问题。

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多