C# 在另一个窗口中打开文件,而不阻止视图中的后续调用/并发调用

C# 在另一个窗口中打开文件,而不阻止视图中的后续调用/并发调用,c#,asp.net,asp.net-mvc,async-await,C#,Asp.net,Asp.net Mvc,Async Await,在我们的一个页面中,我们有一个文件视图选项。单击该文件时,我们调用一个控制器操作方法,该方法返回一个FileResult。此文件显示在其他选项卡中。问题在于文件大小,加载文件需要几秒钟,直到文件从服务器返回,其他操作无法从UI完成。仅当此操作完成时,后续请求才会命中。有没有办法在不影响后续请求的情况下打开此文件 下面是我们目前使用的方法 [HttpGet] public async Task<FileResult> OpenAttachment(string attachid) {

在我们的一个页面中,我们有一个文件视图选项。单击该文件时,我们调用一个控制器操作方法,该方法返回一个FileResult。此文件显示在其他选项卡中。问题在于文件大小,加载文件需要几秒钟,直到文件从服务器返回,其他操作无法从UI完成。仅当此操作完成时,后续请求才会命中。有没有办法在不影响后续请求的情况下打开此文件

下面是我们目前使用的方法

[HttpGet]
public async Task<FileResult> OpenAttachment(string attachid)
{
    var attachment = await Task.Run(() => this._commService.OpenAttachment(attachid));
   
    if (attachment == null)
    {
        throw new PnnCustomExceptions("File not found");
    }

    attachment.FileName = attachment.FileName.AddAttachmentNameExtension(attachment.MimeType);

    var cd = new ContentDisposition
    {
        Inline = true,
        FileName = attachment.FileName
    };

    Response.Clear();
    Response.AddHeader(CoreConstants.ContentDisposition, cd.ToString());
    Response.AddHeader(CoreConstants.WindowTarget, CoreConstants.WindowTargetBlank);
    Response.BufferOutput = false;
    return File(attachment.Data, attachment.MimeType);
} 
[HttpGet]
公共异步任务OpenAttachment(字符串attachid)
{
var attachment=wait Task.Run(()=>this.\u commService.OpenAttachment(attachid));
如果(附件==null)
{
抛出新的PNNCustomeException(“未找到文件”);
}
attachment.FileName=attachment.FileName.AddAttachmentNameExtension(attachment.MimeType);
var cd=新的ContentDisposition
{
Inline=true,
FileName=附件.FileName
};
Response.Clear();
AddHeader(CoreConstants.ContentDisposition,cd.ToString());
AddHeader(CoreConstants.WindowTarget,CoreConstants.WindowTargetBlank);
Response.BufferOutput=false;
返回文件(attachment.Data、attachment.MimeType);
} 

在MVC中有什么方法可以做到这一点吗?

这个问题与同一会话中的并发请求有关。我们在控制器中添加了会话状态行为来解决此问题。由于这个控制器永远不会更新会话,我们在控制器中添加了一个如下所示的装饰器

  [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
  public class AttachmentController
{
....
}

由于此控制器使用会话只读进行修饰,因此它不会对并发请求排队。

如果在另一个选项卡中打开文件,UI如何“阻止”?为什么你不能回到原来的标签页继续工作?浏览器坏了吗?因为如果是这样的话,那不是后端可以解决的问题,那是客户端机器的问题。@Flater我已经更新了这个问题。那么您的服务器可以处理多少请求?如果您发出的请求只是等待Task.Delay(100000),那么您的后端在此期间是否仍然无法处理任何其他请求?这可能不是一个特定于代码的问题,而是一个硬件问题。Web服务器确实需要一次处理多个请求的能力。要么是后端服务器资源严重不足,要么是文件生成过于繁重,不应该直接在后端服务器上完成。或者你只是专注于本地调试会话?