I have developed a number of internal REST interfaces using the older WCF framework in VS 2010. The ability for it to generate help pages was handy for DEV and QA platforms, but for a production release it was easy to disable the generation of these help pages in the web.config file:
<standardEndpoint name="" helpEnabled="false" automaticFormatSelectionEnabled="true"/>
I am now moving on to use the WebAPI framework instead (currently version 1 on VS 2012), but it doesn't appear to be as trivial to turn this feature off (i.e. I can't find any information on how to do this in a web.config file).
Certainly I can go ahead and do this by hand within the code itself, but surely there's an easier way; something akin to how WCF did it as described above. I'd like to use the web.config file approach since I already have the web.release.config transform files in place for other settings.
Any thoughts on best practices on this would be appreciated.
Web API doesn't have an out of box support with respect to web.config based enabling or disabling of helppage.
Some options you can consider:
Since HelpPage is installed as an MVC area, when deploying to
production you could just exclude this HelpPage
folder.
Create an action filter which returns 404 as suggested here: Conditionally disable ASP.NET MVC Controller
NOTE: for the above cases, if you are using the default Web API template, then yeah you would need additional step of display/not display the Help
link from the navigation bar.
Open the Global.asax.cs,modify your code like the following snippet code:
#if DEBUG
AreaRegistration.RegisterAllAreas();
#endif
Because the help page is in the Area named 'HelpPage',so we can ignore it by the above code in the release or production environment.
You can use directive #if DEBUG to hide your code in realase
In case someone stumbles upon this question, here's how I managed to do it.
I added the following app setting to the base Web.config file:
<add key="ExcludeHelpPage" value="false" />
I then transformed this value in my LIVE or RELEASE config file, like this:
<add key="ExcludeHelpPage" value="true" xdt:Transform="Replace" xdt:Locator="Match(key)" />
Then I added the following code to the end of my WebApiConfig.Register method:
if (Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["ExcludeHelpPage"]))
{
config.Routes.IgnoreRoute("help", "help");
}
This will make the help page unavailable for configs with ExcludeHelpPage set to true.
My solution for disabling ApiController
controller:
- Uses WebConfig AppSettings config flag instead of (
#if DEBUG
)
- Before method is invoked
ExecuteAsync
intercepts the invocation and checks feature toggle (feature flag);
- if feature is disabled, returns
HTTP 410 GONE
- If it's common for many controllers, move the code to controller's base class
The code:
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);
}