Instalação do TFS e ISAPI Filters

Recentemente tive um grande problema fazendo o upgrade do TFS2013 para o TFS2015 em um cliente. A princípio achei que houvesse algum problema no processo de Upgrade, mas depois descobri que o problema estava relacionado a uma configuração de ambiente, até certo ponto comum em lugares que possuem um alto grau de controle de segurança em seus ambientes. Na minha opinião, esse item deveria estar nos pré-requisitos para instalação do TFS.

O problema foi o seguinte:

  • Realizei o upgrade utilizando o a midia de instalação do TFS2015, sem problemas algum. Escolhi o local de instalação como sendo o mesmo local anterior e tudo decorreu sem problemas (next, next e finish). O instalador identifica automaticamente que se trata de upgrade, e desinstala a versão anterior e instala a nova por cima. Ele também realiza o upgrade nas bases de dados. Tudo muito perfeito.
  • O único erro que tive foi a instalação do agente de build. Por algum motivo ele não conseguiu instalar o agente. Não dei muita bola para isso, porque essa máquina era o App Tier, e não queria mesmo instalar agente de build. Esse era o agente do novo Build. Até cheguei olhar o log, mas a exceção era bem genérica então desprezei.
  • Após a instalação fiz alguns testes utilizando o Team Explorer no Visual Studio, e tudo estava ok. Contudo, quando fui mostrar as novas funcionalidade do Board para o pessoal, apareceu um erro 404:

Instalação do TFS e ISAPI Filters

  • E o pior, quando o próprio pessoal foi na aba Code para testar a visualização do código, mais um problema, o código não estava sendo exibido:

Instalação do TFS e ISAPI Filters

  • Eu nunca tinha visto isso antes, totalmente bizarro. A primeira coisa que fiz foi isolar e ter certeza que o problema era só no Web Access. Ainda bem que era :-). Então achei que poderia ser o fato de eu ter instalado no mesmo diretório de instalação anterior. Resolvi desinstalar e reinstalar tudo em outro local.
  • Desinstalei, reinstalei no modo App Tier Only (já que as bases de dados já tinham sido migradas para TFS2015), e então, mesmo problema.
  • Não tive escolha e fui debugar. Descobri quais eram as requisições dessas duas paginas que estavam com problema. Na verdade existiam outras paginas com o mesmo problema, mas foquei apenas nesses dois casos:

Instalação do TFS e ISAPI Filters

Essas eram as requisições geradas em cada uma das telas:

Salvar configurações dos Cards
PUT /tfs/DefaultCollection/4d48e776-2346-4952-9eeb-f61334a81bbd/8cafe4a0-85a2-4ec1-880d-e10a53985301/_apis/work/boards/5bc5f63c-d931-4c35-89ce-c9d763253769/cardsettings HTTP/1.1

Visualizar codigo na Web (aba code)
OPTIONS /tfs/DefaultCollection/_apis/tfvc HTTP/1.1

De cara suspeitei ser alguma coisa com o verbos https utilizado (PUT e OPTIONS).
Numa busca rápida pela internet, vi que para o TFS funcionar, verbos HTTP como OPTIONS e PUT deveriam estar habilitados.
Consultando diretamente no IIS, não encontrei qualquer restrição com relação a verbos http.

Então fui para o log no IIS, e vi que as requisições estavam sendo rejeitadas pelo URLSCAN e que chegavam como GET:

IIS log
2015-08-29 17:25:19 10.19.150.182 GET /Rejected-By-UrlScan ~/tfs/DefaultCollection/4d48e776-2346-4952-9eeb-f61334a81bbd/8cafe4a0-85a2-4ec1-880d-e10a53985301/apis/work/boards/5bc5f63c-d931-4c35-89ce-c9d763253769/cardsettings 8080 CORPimacedoadm 10.19.135.65 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.1;+Win64;+x64;+Trident/5.0;+.NET+CLR+2.0.50727;+SLCC2;+.NET4.0C;+.NET4.0E;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30729) http://jbhbtfssr001:8080/tfs/DefaultCollection/Sis.%20Financeiros%20e%20Fiscais/backlogs/board/Releases 404 0 2 207

2015-08-29 17:24:55 10.19.150.182 GET /Rejected-By-UrlScan ~/tfs/DefaultCollection/apis/tfvc 8080 CORPimacedoadm 10.19.135.65 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.1;+Win64;+x64;+Trident/5.0;+.NET+CLR+2.0.50727;+SLCC2;+.NET4.0C;+.NET4.0E;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30729) http://jbhbtfssr001:8080/tfs/DefaultCollection/Sis.%20Financeiros%20e%20Fiscais/versionControl 404 0 2 207

Eu não conhecia o URLScan mas quando vi do que se tratava (http://www.iis.net/learn/extensions/working-with-urlscan/urlscan-3-reference#AlwaysAllowedUrlsSection) tive certeza de que tinha achado o problema. Confirmei então que o URLScan estava instalado:

Instalação do TFS e ISAPI Filters

Consultei o log do URLScan para saber porque ele estava rejeitando as requisições e, BINGO!

Instalação do TFS e ISAPI Filters

Então abri o arquivo de configuração e certifiquei que os verbos não estavam sendo permitidos:

URLSCAN.INI
Instalação do TFS e ISAPI Filters

A solução então foi habilitar os verbos no URLScan.
Consultei os verbos utilizados na API Rest do TFS: https://www.visualstudio.com/integrate/get-started/rest/basics​

Instalação do TFS e ISAPI Filters

E atualiazei as configurações do URLScan (acrescentando o OPTIONS que não consta na api pública):

Instalação do TFS e ISAPI Filters

Depois disso, tudo funcionou novamente:

Instalação do TFS e ISAPI Filters

Instalação do TFS e ISAPI Filters

Conclusão:

Não é apenas elementos externos de rede (como Firewalls) que podem “atrapalhar” o funcionamento do TFS. Configurações de dentro do proprio IIS podem influenciar.

Normalmente o TFS já realiza todas as configurações necessárias no IIS e Windows. Mas plugins e ISAPI filters acessórios não são checados. Um outro exemplo de um problema similiar pode ser observado nesse post do Igor Abade falando de problemas no TFS quando o WebDAV estava instalado:
http://www.tshooter.com.br/2015/02/20/webdav-pode-causar-erro-500-no-tfs/#more-6091

Fiquem atentos!