...che mi hanno fatto un po' penare!

Proprio poco tempo fa, ad un cliente è venuta la malsana idea di cambiare la documentazione visualizzata nel browser, all'invocazione di un web service.
Per il FW 2.0, chi si occupa di generare e visualizzare la documentazione, per default è la pagina C:\WINDOWS\Microsoft.Net\Framework\v2.0.50727\CONFIG\DefaultWsdlHelpGenerator.aspx

Questa impostazione può essere cambiata all'inteno del web.config, andando a specificare una pagina custom:

<configuration>
  <system.web>

     <!-- Modifica la pag. che si occupa di generare/visualizzare la documentazione -->        
     <webServices>        
       <wsdlHelpGenerator href="myWebServiceDocumentation.aspx"/>
     </webServices>

  </system.web>
</configuration>


Se invece si volesse completamente nascondere la documentazione generata e mostrare un errore server, sia che si tenti di richiamare la documentazione HTML generata, sia che si invochi direttamente il wsdl:

<configuration>
  <system.web>

    <webServices>
    <!-- Nasconde la documentazione, sia l'html generato che l'invocazione del wsdl -->
      <protocols>
        <remove name="Documentation"/>           
      </protocols>
    </webServices>

  </system.web>
</configuration>


Nel caso in cui si voglia agire selettivamente, implementando una logica di visualizzazione del wsdl a seconda del chiamante, oppure si volesse mostrare solo l'html della documentazione, ma non il wsdl, occorre scrivere un paio di righe di codice nel Global.asax, andando ad intercettare l'evento BeginRequest dell'Applicazione:

  • Caso 1 - voglio mostrare solo l'html generato ma non il wsdl (e il disco)
protected void Application_BeginRequest(object sender, EventArgs e)
{
  string url = Request.RawUrl.Trim().ToLower();
  
  if (url.Contains("?wsdl") || url.Contains("?disco"))
    throw new HttpException(404, "Documentation not available");
}
  • Caso 2 - voglio mostrare la documentazione selettivamente, a seconda del chiamante:
protected void Application_BeginRequest(object sender, EventArgs e)
{
  string url = Request.RawUrl.Trim().ToLower();

  // Recupero l'IP del chiamante
  string IP = this.Context.Request.ServerVariables["REMOTE_ADDR"];

  // La mia logica di selezione...
  if (IP != "127.0.0.1")
    throw new HttpException(404, "Documentation not available");
}

 P.S. ...sorry, l'ho ripostato a causa della lettera accentata nel titolo che lo rendeva irraggiungibile.