Веб-страницы ASP.NET не отвечают во время загрузки файла

У меня есть веб-страница ASP.NET с элементом управления FileUpload


      <asp:FileUpload ID="fileUploadTN" style="width:250px" runat="server" />

Одна из проблем заключается в том, что при загрузке больших файлов мой сеанс asp.net истекает. Это связано с ограничением в DiscountAsp.net и непревзойденным 20-минутным тайм-аутом сеанса (если не переключиться на SqlServer). Нет проблем с загрузкой большого файла, просто сеанс умирает вскоре после завершения.

Итак, у меня есть обходной путь: таймер javascript периодически обращается к другой веб-странице, чтобы сеанс продолжался дольше.

       function timerEvent()
       {
         jQuery.get( "/svc.aspx?act=ping", function(data) { });
       }

Это отлично работает, за исключением загрузки файлов. Во время загрузки файла на HTTP GET нет ответа, и запрос даже не попадает на страницу svc.aspx. Я могу наблюдать в Fiddler, и происходит GET, но ответа нет. Как только загрузка файла будет завершена, ответы начнутся снова. Но при длительной загрузке файла мой сеанс может быть отключен по тайм-ауту.

Даже если я открою новое окно в браузере и перейду на страницу svc.aspx напрямую, он застрянет в запросе. Я могу открыть окно в другом окне браузера приложений (например, FF -> Chrome), и svc.aspx ответит. Таким образом, кажется, проблема возникает, когда в том же сеансе другие HTTP-запросы GET не отвечают во время загрузки файла.


person Ron    schedule 05.04.2011    source источник
comment
Попробуйте изменить его на ashx.   -  person SLaks    schedule 05.04.2011
comment
Я попробую это сделать, но само по себе не похоже, что это сохранит сеанс в живых. В некоторых исследованиях, похоже, мне нужно будет реализовать IRequiresSessionState также в IHttpHandler. Буду обновлять позже по мере продвижения   -  person Ron    schedule 05.04.2011
comment
Slaks, я попробовал ASHX, и он частично сработал. Если бы только IHttpHandler, я мог бы получить к нему доступ во время загрузки файла. Но как только я добавил IRequiresSessionState для обновления сеанса, возникла проблема с доступом. Поскольку основная цель - обновить Сессию, то, похоже, это не сработает.   -  person Ron    schedule 06.04.2011


Ответы (1)


Для больших файлов лучше использовать какую-нибудь программу загрузки Flash - например, Uploadify или SWFUpload Я предпочитаю использовать Uploadify. Ниже приведен пример из моего проекта. Вы должны включить uploadify.css и jquery, swfobject и jquery. Загрузить файлы JavaScript и инициализировать uploadify на своей странице ASPX:

<link href="uploadify.css" rel="stylesheet" type="text/css" />
<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
<script src="Scripts/swfobject.js" type="text/javascript"></script>
<script src="Scripts/jquery.uploadify.v2.1.4.min.js" type="text/javascript"></script>
<script type="text/javascript">
   // <![CDATA[
    $(document).ready(function () {
        $('#fileInput').uploadify({
            'uploader': 'Scripts/uploadify.swf',
            'script': 'Upload.ashx',
            'scriptData': {},
            'cancelImg': 'Images/cancel.png',
            'auto': true,
            'multi': true,
            'fileDesc': 'PDF files',
            'fileExt': '*.pdf',
            'queueSizeLimit': 90,
            'sizeLimit': 4000000,
            'buttonText': 'Browse',
            'folder': '/uploads',
            'onComplete': function (event, queueID, fileObj, response, data) {
                var message = '<div>' + response + '</div>';
                var results = $('#uploadResults');
                results.html(message + results.html());
            },
            'onAllComplete': function (event, queueID, fileObj, response, data) {
            }
        });
    });

 // ]]></script>

Вместо элемента управления asp: FileUpload используйте ввод с типом - файл. Здесь нужен HTML:

    <input id="fileInput" name="fileInput" type="file" />
    <div id="uploadResults"></div>

Затем создайте обработчик ASHX, который будет обрабатывать ваши загрузки:

public class Upload : IHttpHandler, IRequiresSessionState
{
    public void ProcessRequest(HttpContext context)
    {
        try 
        {
            HttpPostedFile file = context.Request.Files["Filedata"];

        // Validate file for content length, extension etc. 
        // Store file on server or do what you want with file
        // Use context.Response.Write to send messages which will be displayed in <div id="uploadResults"></div> 

        } 
        catch (Exception ex) 
        {
          context.Response.Write("Failed to upload file");
        }
    }
}
person marisks    schedule 06.04.2011
comment
Думаю, я понял, что средство загрузки файлов ASP.NET не подходит для больших файлов. Я рассматривал возможность ajaxuploader.com, но я также рассмотрю это. Мы уже используем Flash, так что ваше предложение должно быть в порядке. AjaxUploader уже полностью является ASP.NET, поэтому может быть немного проще интегрировать в отношении получения уведомлений о завершении и т. Д., Но похоже, что у Uploadify есть событие, поэтому он также должен иметь возможность уведомлять мою UpdatePanel. - person Ron; 06.04.2011