Вызвать HttpHandler из javascript

#javascript #asp.net #ashx

#javascript #asp.net #ashx

Вопрос:

У меня есть простая страница с кнопкой, которая вызывает HttpHandler через JavaScript.

HttpHandler получает множество файлов и добавляет их в zip-файл, после завершения работы zip-файл будет добавлен в ответ.

Эта операция может занять несколько минут. Я хотел бы выполнить некоторую функцию JavaScript после завершения работы HttpHandler.

Как я могу это сделать?

Мой код:

 <asp:Button ID="btnDownload" runat=server Text="Download" OnClientClick="Download()" />

<script type="text/javascript">
    function Download()
    {
        var url = 'FileStorage.ashx';
        window.open(url);            
    }
</script>
  

UPD 1:

Я нашел другое решение. Используя XMLHttpRequest.

Код:

  <script type="text/javascript">
        var xmlHttpReq = createXMLHttpRequest();

        function Download() {
            var url = 'FileStorage.ashx';            
        xmlHttpReq.open("GET", url, false);
        xmlHttpReq.onreadystatechange = onResponse;
        xmlHttpReq.send(null);         
    }

    function onResponse() {
        if (xmlHttpReq.readyState != 4)
        { return; }        
        var serverResponse = xmlHttpReq.responseText;
        alert(serverResponse);        
     }

    function createXMLHttpRequest() {
        try { return new XMLHttpRequest(); } catch (e) { }
        try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { }
        try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { }
        alert("XMLHttpRequest not supported");
        return null;
    }
    </script>
  

В onResponse () я могу видеть свой zip-файл в формате responseText (двоичный). Но я понятия не имею, как я могу сказать браузеру, чтобы он загрузил результат работы httphandler, такой как файл.

Есть идеи?

Ответ №1:

Я бы использовал jQuery AJAX, а затем, в случае успеха, написал функцию, которая будет выполнять любую работу, для которой вам это нужно. Кроме того, с помощью AJAX вы можете показать пользователю значок с надписью loading, чтобы они знали, что что-то на самом деле обрабатывается, вместо того, чтобы страница просто зависала и ничего не происходило.

 $.ajax({
  url: "FileStorage.ashx",
  context: document.body,
  success: function(){
     // Whatever you want to do here in javascript.
  }
});
  

Комментарии:

1. Спасибо, но я не могу использовать jQuery, мне нужно другое решение

2. Тогда не уверен, что смогу помочь. Очевидно, вам нужно знать, когда обработчик завершит выполнение, возможно, путем опроса по таймеру zip-файла в каталоге. Как только это будет сделано и файл будет найден, запустите функцию. Хотя это кажется неправильным. Извините.