1. Crie seu .asmx e seu .asmx.cs normalmente;
  2. Crie um site no IIS apontando para o diretório onde foi feita a implantação do .asmx (geralmente C:\program files\common files\microsoft shared\web server extensions\<versão>\ISAPI\<projeto>);
  3. Através desse novo site, acesse o .asmx?wsdl. Se o código estiver correto, ele vai funcionar, gerando o wsdl em xml;
  4. Salve esse arquivo .xml. Copie o conteúdo dele para o arquivo <nome_igual_ao_asmx>wsdl.aspx, criado juntamente com o arquivo .asmx (na mesma pasta);
  5. Não utilize a formatação automática do Visual Studio nesse XML, senão o WSDL ficará inválido;
  6. Não deixe a tag de header <?xml …> no início do arquivo, senão ele ficará inválido;
  7. Altere as tags fixas de endereço do Web Service com tags dinâmicas, seguindo o exemplo de outros .aspx do projeto. Esse é o motivo do arquivo precisar terminar com a extensão .aspx: para que ele seja processado e o endereço possa ser dinâmico de acordo com as configurações AAM;
  8. Faça a implantação e teste acessando pelo endereço do SharePoint (/_vti_bin/<projeto>/<WebService>.asmx?wsdl). Se o WSDL aparecer corretamente, está funcionando;
  9. Lembre-se que toda vez em que houver manutenção na assinatura do método será necessário re-gerar o asmx.aspx. Dica: Tente copiar/colar só a parte que foi alterada, se for uma alteração pequena.