Пример #1
0
        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);
        }