public static ServiceHost AddMetadataBehaviors( this ServiceHost host, MetadataFeatures features = MetadataFeatures.All) { if (host == null) { throw new ArgumentNullException(nameof(host)); } var serviceMetadataBehavior = host.Description.Behaviors.Find <ServiceMetadataBehavior>(); // if no metadata is requested - remove the behavior altogether if (features == MetadataFeatures.None) { if (serviceMetadataBehavior != null) { host.Description.Behaviors.Remove(serviceMetadataBehavior); } return(host); } // add the metadata behavior, if it is not there yet if (serviceMetadataBehavior == null) { serviceMetadataBehavior = new ServiceMetadataBehavior(); host.Description.Behaviors.Add(serviceMetadataBehavior); } // disable the help page if not requested or if we have REST-ful endpoints if (!features.HasFlag(MetadataFeatures.HelpPage) || host.Description.Endpoints.Any(ep => ep.Binding is WebHttpBinding)) { var serviceDebugBehavior = host.Description.Behaviors.Find <ServiceDebugBehavior>(); if (serviceDebugBehavior != null) { serviceDebugBehavior.HttpHelpPageEnabled = serviceDebugBehavior.HttpsHelpPageEnabled = false; } var ep = host.Description.Endpoints.Where(e => e.Binding is WebHttpBinding).FirstOrDefault(); if (ep != null) { if (ep.EndpointBehaviors.Where(b => b is WebHttpBehavior).FirstOrDefault() is WebHttpBehavior epb) { epb.HelpEnabled = false; } } } // disable the Web HTTP (REST) help page if (!features.HasFlag(MetadataFeatures.WebHttpHelpPage)) { var ep = host.Description.Endpoints.Where(e => e.Binding is WebHttpBinding).FirstOrDefault(); if (ep != null) { if (ep.EndpointBehaviors.Where(b => b is WebHttpBehavior).FirstOrDefault() is WebHttpBehavior epb) { epb.HelpEnabled = false; } } } // add the GET WSDL behavior if requested if (features.HasFlag(MetadataFeatures.Wsdl)) { serviceMetadataBehavior.HttpsGetEnabled = host.BaseAddresses.Any(a => a.Scheme == Uri.UriSchemeHttps); #if DEBUG serviceMetadataBehavior.HttpGetEnabled = host.BaseAddresses.Any(a => a.Scheme == Uri.UriSchemeHttp); #endif Debug.WriteLineIf( !serviceMetadataBehavior.HttpGetEnabled && !serviceMetadataBehavior.HttpsGetEnabled, "\n**** If you need a GET service metadata (WSDL) behavior, define a base address with an http(s) scheme. ***\n"); } else { serviceMetadataBehavior.HttpGetEnabled = serviceMetadataBehavior.HttpsGetEnabled = false; serviceMetadataBehavior.HttpGetUrl = serviceMetadataBehavior.HttpsGetUrl = null; } // if IMetadataExchange contract is requested - add it if (features.HasFlag(MetadataFeatures.Mex)) { host.AddMexEndpoints(); } return(host); }