возвращает осмысленную строку ошибки в браузер при ожидании большого двоичного объекта

#c# #ajax

#c# #ajax

Вопрос:

Я возвращаю файл PDF или XLSX в браузер. Я делаю это, устанавливая responseType объекта ajax, который инициировал запрос на ‘blob’. Похоже, это работает по мере необходимости. У меня возникли проблемы с поиском хорошего способа передачи строки ошибки в браузер в случаях, когда файл не удалось создать.

Если я не задаю никакого responseType для объекта ajax, я могу прочитать текст ответа как заданную мной строку ошибки meaninful. Это, однако, означает, что я больше не могу правильно прочитать ответ в виде файла PDF или XLSX в тех случаях, когда все происходило должным образом. И, конечно, я не могу установить responseType объекта ajax после получения ответа.

Контроллер

 public ActionResult GetFile() {
   // process work, set stream and success bool

   if (wasSuccessful) {
      return File(stream, "application/pdf");
   }
   else {
      return Content("a meaningful error for the UI");
   }
}

  

cshtml

 function getFile(e, extension) {
   var xhr = new XMLHttpRequest();
   xhr.open('POST', e.value, true);
   xhr.responseType = 'blob';
   xhr.setRequestHeader('Content-Type', "application/x-www-form-urlencoded");

   xhr.onload = function (ee) {
      if (this.status == 200) {
         var a = document.createElement("a");
         document.body.appendChild(a);
         a.style = "display: none";
         var blob = new Blob([this.response], { type: 'octet/stream' }), url = window.URL.createObjectURL(blob);
         a.href = url;
         a.download = "file."   extension;
         a.click();
         window.URL.revokeObjectURL(url);
      }
   };

   xhr.send($("#form").serialize());
}
  

Могу ли я заставить свой ajax ожидать большой двоичный объект, но каким-то образом прочитать простую строку в определенных условиях ошибки?

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

1. Просто используйте блок if / else на основе responseType

2. Мне нужно установить responseType в ‘blob’, чтобы иметь возможность правильно использовать файл. Это означает, что responseType — это ‘blob’ и что я не могу его включить.

3. Ваш код контроллера показывает, что вы возвращаете Content результат, который, вероятно, будет иметь responseType значение «текст»… Если у вас ошибка, предположительно, у вас не будет файла для загрузки…

4. В случае ошибки верните другой код состояния HTTP с сервера, тогда вы сможете обработать ошибку, а не пытаться обработать условно «успешный» ответ другими способами

5. @HereticMonkey Я могу задать тип ответа для этого ответа содержимого, но если для запроса ajax установлен тип ответа ‘blob’, то тип ответа будет ‘blob’ независимо от того, какой тип ответа я установил для содержимого. И если я не установлю для него значение blob в запросе ajax, я не смогу правильно прочитать файл.