Невозможно получить доступ к веб-сайту, пока другая вкладка загружает файл (с того же веб-сайта) - PullRequest
0 голосов
/ 12 сентября 2018

Итак, я работаю над проектом .NET MVC, который работает на небольшом веб-сервере с ограниченными ресурсами.Однако у сайта есть довольно большие файлы, которые он обслуживает пользователям.А из-за ограниченного объема доступной оперативной памяти на сервере стандартный FileResult возвращаемый тип действия привел к OutOfMemoryException.

. Поэтому мне пришлось обойти эту проблему, поскольку обновление сервера былоне вариант.Я пришел со следующим решением:

public partial class DownloadController : Controller
{
    // GET: Download
    public virtual ActionResult Index(string path)
    {

        try
        {
            fullPath = Server.MapPath($"~/downloadable_files/{path}");
            var fileName = fullPath.Substring(fullPath.LastIndexOf('\\') + 1);

            Response.Clear();
            Response.ContentType = System.Net.Mime.MediaTypeNames.Application.Octet;
            Response.AppendHeader("Content-Disposition", new System.Net.Mime.ContentDisposition("attachment") { FileName = fileName }.ToString());

            Response.TransmitFile(fullPath);

            Response.End();

            return Redirect(Request.UrlReferrer.AbsoluteUri);
        }
        catch (Exception e)
        {
            return HttpNotFound();
        }

    }
}

Это прекрасно работает.Однако, пока пользователь загружает файл, он не может продолжать просматривать веб-сайт в том же браузере.Это как действие блокирует соединение с сервером во время загрузки файла.Я не сталкивался с этим раньше, и мне интересно, может ли это иметь какое-либо отношение к тому, как я подаю файл?Мне кажется, что я упустил некоторые базовые знания здесь.

Любые предложения будут с благодарностью.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Если это действительно блокировка сеанса, как предлагают некоторые пользователи, вы можете исправить ее, отключив состояние сеанса на этом контроллере.Разумеется, вы нигде не используете sessionState внутри этого контроллера.

[ControllerSessionState(SessionStateBehavior.Disabled)]
public partial class DownloadController : Controller
{
  // etc.
}
0 голосов
/ 12 сентября 2018

Длительные запросы могут привести к непредсказуемым результатам и снижению производительности вашего веб-приложения.Время ожидания по умолчанию для запроса составляет 110 секунд.Если вы используете состояние сеанса с длительным запросом, ASP.NET снимет блокировку объекта Session через 110 секунд.Однако ваше приложение может быть в середине операции над объектом Session, когда снята блокировка, и операция может не завершиться успешно.Если второй запрос пользователя заблокирован во время выполнения первого запроса, второй запрос может получить доступ к объекту Session в несогласованном состоянии.

Если ваше приложение включает в себя блокирующие (или синхронные) операции ввода-вывода,приложение не отвечает.

Чтобы повысить производительность, используйте асинхронные операции ввода-вывода в .NET Framework.Также используйте WebSockets или SignalR для подключения клиентов к серверу.Эти функции предназначены для эффективной обработки долгосрочных запросов.

https://docs.microsoft.com/en-us/aspnet/aspnet/overview/web-development-best-practices/what-not-to-do-in-aspnet-and-what-to-do-instead#long-running-requests-110-seconds

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...