Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从网络共享下载ASP.NET核心(有时有效?)_C#_Asp.net Core - Fatal编程技术网

C# 从网络共享下载ASP.NET核心(有时有效?)

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

我有一个非常标准的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();
        }));
    }
}
公共静态异步任务模拟(Action actionToExecute、ApplicationSettings设置)
{
IntPtr令牌句柄=新的IntPtr(0);
SafeAccessTokenHandle SafeAccessTokenHandle=null;
ImpersonateLogin login=新建ImpersonateLogin(设置);
Task returnValue=Task.Run(()=>LogonUser(login.username、login.domain、login.password、2、0、out-safeAccessTokenHandle));
if(false==returnValue.Result)
{
int-ret=Marshal.GetLastWin32Error();
抛出新的System.ComponentModel.Win32Exception(ret);
}
if(safeAccessTokenHandle!=null)
等待returnValue.ContinueWith(antecedent=>WindowsIdentity.RunImpersonated(safeAccessTokenHandle,()=>
{
actionToExecute();
}));
}
}
在本地,它工作正常(我们使用appsetting跳过模拟),文件返回并在浏览器中设置为下载

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

但反复刷新此错误页面(即重新请求该文件)将使其正常工作(通常每2-4次刷新将正确返回文件)

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

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