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

У меня есть веб-страница 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 не отвечают во время загрузки файла.

1 Ответ

0 голосов
/ 06 апреля 2011

Для больших файлов лучше использовать Flash Uploader - например, Uploadify или SWFUpload Я предпочитаю использовать Uploadify.Ниже приведен пример из моего проекта.Вы должны включить файлы JavaScript uploadify.css и jquery, swfobject и jquery.uploadify и инициализировать 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 используйте ввод с type-file.Здесь необходим 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");
        }
    }
}
...