2014-06-11 11 views
13

Ho sviluppato un numero di interfacce interne di REST utilizzando il framework WCF precedente in VS 2010. La possibilità di generare pagine di aiuto era comodo per le piattaforme DEV e QA, ma per una versione di produzione è stato facile per disabilitare la generazione di queste pagine di aiuto nel web.config di file:Pagine di aiuto WebAPI: disabilitato per la versione di produzione

<standardEndpoint name="" helpEnabled="false" automaticFormatSelectionEnabled="true"/> 

sono ora di passare ad utilizzare il quadro WebAPI invece (attualmente la versione 1 su VS 2012), ma doesn Sembra essere banale disattivare questa funzione (cioè non riesco a trovare alcuna informazione su come farlo in un file web.config).

Certamente posso andare avanti e farlo manualmente nel codice stesso, ma sicuramente c'è un modo più semplice; qualcosa di simile a come la WCF ha fatto come descritto sopra. Mi piacerebbe utilizzare l'approccio del file web.config poiché ho già il web.release.config trasformare i file in posizione per altre impostazioni.

Qualsiasi considerazione sulle migliori pratiche in merito sarebbe apprezzata.

risposta

6

Web API non ha un supporto predefinito per quanto riguarda l'abilitazione o disabilitazione di helppage basata su web.config.

Alcune opzioni che si possono prendere in considerazione:

  • Dal helppage è installato come una superficie MVC, durante la distribuzione di produzione si può solo escludere questa cartella HelpPage.

  • Creazione di un filtro di azione che restituisce 404 come suggerito qui: Conditionally disable ASP.NET MVC Controller

NOTA: per i casi di cui sopra, se si utilizza il modello Web API di default, allora sì si avrebbe bisogno di ulteriore fase di visualizzazione/non visualizzare il collegamento Help dalla barra di navigazione.

+0

Sì, questo è quello che sembra essere . In questo caso sto usando il modello predefinito, ma non penso che sarà molto lavoro aggirare questo. Posso certamente inserire un indicatore nel file web.config per uso personale all'interno del codice, o magari aggiungere una direttiva per il preprocessore RELEASE e usare il buon vecchio '#if #endif per bloccare il codice ... – GoodEnuf

+0

Ho appena eliminato la cartella delle aree . Swagger API è molto più bello di quello predefinito comunque. – Zapnologica

3

È possibile utilizzare direttiva #if DEBUG per nascondere il codice in realase

+0

Il flag DEBUG non è utilizzabile nella maggior parte dei casi, poiché la gestione temporanea e l'ambiente di test vengono eseguiti senza DEBUG. –

1

Nel caso in cui qualcuno si imbatte in questa domanda, ecco come sono riuscito a farlo.

ho aggiunto la seguente impostazione applicazione per il file di base web.config:

<add key="ExcludeHelpPage" value="false" /> 

Ho poi trasformato questo valore nel mio file di configurazione LIVE o STAMPA, in questo modo:

<add key="ExcludeHelpPage" value="true" xdt:Transform="Replace" xdt:Locator="Match(key)" /> 

Poi ho aggiunto il seguente codice alla fine del mio metodo WebApiConfig.Register:

if (Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["ExcludeHelpPage"])) 
{ 
    config.Routes.IgnoreRoute("help", "help"); 
} 

Questa volontà ma ke la pagina di aiuto non è disponibile per le configurazioni con ExcludeHelpPage impostato su true.

+0

La tua idea sembra davvero eccezionale ma non funziona per me. Nel mio registro ho questo 'config.Routes.MapHttpRoute ( nome:" DefaultApi ", routeTemplate:" api/{controller}/{id} ", valori predefiniti: nuovo {id = RouteParameter.Optional} );' e aggiungo il tuo codice dopo. Ma su "HelpPageAreaRegistration.cs" ho 'new {controller =" Help ", action =" Index ", apiId = UrlParameter.Optional});" Qualche idea sul perché l'aiuto non venga ignorato? – NunoRibeiro

4

Aprire il Global.asax.cs, modificare il codice come il seguente frammento di codice:

#if DEBUG 
    AreaRegistration.RegisterAllAreas(); 
#endif 

Perché la pagina di aiuto è in zona denominata 'helppage', in modo che possiamo ignorarlo dal codice di cui sopra nell'ambiente di rilascio o di produzione.

+0

Questo di per sé non è una soluzione sicura. Se si inserisce l'URL nel browser, si ottiene un'eccezione non gestita completa di informazioni sulla traccia di stack e sulla versione sia per .NET Framework che per ASP.NET – Chris

1

mia soluzione per la disattivazione ApiController regolatore:

  • Utilizza WebConfig AppSettings bandiera config anziché (#if DEBUG)
  • Prima metodo viene richiamato ExecuteAsync intercetta l'invocazione e controlli dispongono ginocchiera (bandiera funzione);
  • se la funzione è disabilitata, restituisce HTTP 410 GONE
  • Se è comune per molti controllori, spostare il codice di classe di base del controller

Il codice:

public class TestController : ApiController 
{ 
    public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) 
    { 
     var featureFlag = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["EnableTest"]); 

     if (featureFlag == false) 
     { 
      return Task.FromResult(new HttpResponseMessage(HttpStatusCode.Gone)); 
     } 

     return base.ExecuteAsync(controllerContext, cancellationToken); 
    } 
Problemi correlati