WCF - Exception Difference between programmatic and static bindings?

I have a trivial WCF service library that divides a number and can return a specialized "Divide By Zero" exception. That all works perfectly when set up with the Web bindings in app.config.

When I try to set up those binding programmatically, however, I lose something and all exceptions now come through at CommunicationException (BadProtocol). When the bindings are set up through app.config, I get the proper exception data.

Here is my code to set up and call the interface. The Divide function will throw an exception of DivideByZero. But for programmatic bindings, it comes through as ProtocolException.

I have tried both true and false for the value of IncludeExceptionDetailInFaults, to no avail.

            IDemoService client;

        WebServiceHost host = new WebServiceHost(typeof(ServiceLibrary.DemoService), new Uri("http://localhost:8080/"));

        // If Debug setting is not found, add it

        ServiceDebugBehavior debug = host.Description.Behaviors.Find<ServiceDebugBehavior>();
        if (debug == null)
            host.Description.Behaviors.Add(new ServiceDebugBehavior() { IncludeExceptionDetailInFaults = true });
        else
            if (!debug.IncludeExceptionDetailInFaults)
            debug.IncludeExceptionDetailInFaults = true;

        ServiceMetadataBehavior metadata = new ServiceMetadataBehavior() { HttpGetEnabled = true };
        host.Description.Behaviors.Add(metadata);

        try
        {
            host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "http://localhost:8080/mex/");
        }
        catch (Exception ex)
        {
            return;
        }

        try
        {
            host.AddServiceEndpoint(typeof(ServiceLibrary.IDemoService), new WebHttpBinding(), "");
            host.Open();
        }
        catch (Exception ex)
        {
            return;
        }

        // Next, connect to the endpoint for our own use

        try
        {
            // Set the max msg large, otherwise max size would be 64K and we couldn't fetch all the logs.
            // REVIEW I suppose this might expose it to a Denial of Service attack if public

            var binding = new WebHttpBinding()
            {
                MaxReceivedMessageSize = Int32.MaxValue,
            };

            var behavior = new WebHttpBehavior()
            {
                FaultExceptionEnabled = true

            };


            ChannelFactory<IDemoService> cf = new ChannelFactory<IDemoService>(binding, "http://localhost:8080");
            cf.Endpoint.Behaviors.Add(behavior);
            client = cf.CreateChannel();
        }