Upload de Arquivos - Unexpected token < in JSON

Este tópico reúne informações sobre um erro que ocorre no navegador ao tentar fazer Upload de Arquivos.

Problema

Ao tentar fazer o Upload de um arquivo no Formulário Dinâmico, o campo de Upload fica com o indicador “amarelo”, como se o arquivo estivesse sendo enviado, e o seguinte erro de JavaScript é apresentado no Console do Navegador:

Uncaught SyntaxError: Unexpected token < in JSON at position 0
    at JSON.parse (<anonymous>)
    at Function.m.parseJSON (Telerik.Web.UI.WebResource.axd:2429)
    at g.callback (Telerik.Web.UI.WebResource.axd:3710)
    at XMLHttpRequest.m (Telerik.Web.UI.WebResource.axd:3821)

Causa

Este erro ocorre porque o servidor está fornecendo uma resposta em um formato incorreto após o término do Upload.

Este erro foi encontrado apenas em um ambiente no qual o acesso externo ao site ocorria através de um redirecionamento, de um subdomínio para um IP interno, com porta especificada no final da URL de ambos.

Por exemplo, o endereço

http://latromi.empresa.com:8081/web

era redirecionado para

http://192.168.0.123:8081/web

O erro ocorria apenas quando o site era acessado pelo endereço externo. O problema não ocorria usando o endereço interno. Ou seja, o erro só ocorria quando havia o redirecionamento.

Formato de Resposta

Os Uploads no Latromi são realizados através de um arquivo do tipo ASHX, no endereço Controls/AsyncCustomUploadHandler.ashx usando o método POST.

Ao final do Upload, é gerado um retorno no formato JSON, como este abaixo:

{
   "fileInfo":{
      "FileName":"arquivo.txt",
      "ContentType":"text/plain",
      "ContentLength":1,
      "DateJson":"2020-09-29T23:30:09.539Z",
      "Index":0
   },
   "metaData":"7vXd2TzG...."
}

No entanto, ao tentar fazer o Upload pelo endereço onde havia o redirecionamento, o JSON estava sendo convertido para o formato HTML de maneira forçada:

<html>
   <body>
      <p>{&quot;fileInfo&quot;:{
   &quot;fileInfo&quot;:{
      &quot;FileName&quot;:&quot;arquivo.txt&quot;,
      &quot;ContentType&quot;:&quot;text/plain&quot;,
      &quot;ContentLength&quot;:1,
      &quot;DateJson&quot;:&quot;2020-09-29T23:30:09.539Z&quot;,
      &quot;Index&quot;:0
   },
   &quot;metaData&quot;:&quot;7vXd2TzG....&quot;
}
      </p>
   </body>
</html>

Solução

Pelo fato deste erro ter sido identificado apenas neste ambiente, consideramos que seja um problema de infraestrutura, relacionado a forma como o redirecionamento foi configurado.

Com as informações coletadas até o momento, não sabemos como solucionar o problema mantendo esta forma de redirecionamento.

A nossa recomendação é que o acesso externo ao IIS seja feita de forma tradicional, designando um IP público para o servidor, com tráfego liberado na porta 80 para HTTP ou 443 para HTTPS. Neste formato, todas as requisições entram no IIS pela mesma porta, e os subdomínio são resolvidos pelo IIS através do DNS informado nas ligações do site:

image

Simulação

Para simular o erro, siga os passos abaixo:

  1. Acesse a página onde é feito o Upload usando o Chrome.

  2. Abra o console do navegador pressionando F12.

  3. Selecione a aba Network.

  4. Filtre o tipo de arquivo XHR.

  5. Agora selecione um arquivo para iniciar o Upload.

  6. Se ocorrer o erro, aparecerá um indicador amarelo ao invés de verde ou vermelho:
    image

  7. Agora volte para o console e selecione a requisição AsyncCustomUploadHandler.ashx, e depois clique na aba Response.

  8. Observe que o retorno (response) está no formato HTML, quando na verdade deveria ser JSON.


Atualização

Novas informações sobre a forma como este acesso externo estava configurado:

  • Usando WAF (Web Application Firewall) da Sophos com a opção HTML Rewriting habilitada.