コード例 #1
0
        private void CreateMetadataBehavior(SpringServiceHost ssh, ServiceMetadataBehavior smb, ServiceEndpointElement metadataEle)
        {
            if (smb == null)
            {
                smb = new ServiceMetadataBehavior();
                if (ssh.BaseAddresses.Any(o => o.Scheme.ToLower() == Uri.UriSchemeHttp))
                {
                    smb.HttpGetEnabled = true;
                }
                ssh.Description.Behaviors.Add(smb);
            }

            foreach (var baseAddress in ssh.BaseAddresses)
            {
                //BindingElement bindingElement = null;
                Binding bindingElement = null;
                switch (baseAddress.Scheme)
                {
                case  "net.tcp":
                {
                    bindingElement = MetadataExchangeBindings.CreateMexTcpBinding();
                    //bindingElement = new TcpTransportBindingElement();
                    break;
                }

                case "net.pipe":
                {
                    bindingElement = MetadataExchangeBindings.CreateMexNamedPipeBinding();
                    //bindingElement = new NamedPipeTransportBindingElement();
                    break;
                }

                case "http":
                {
                    bindingElement = MetadataExchangeBindings.CreateMexHttpBinding();
                    //bindingElement = new HttpTransportBindingElement();
                    break;
                }

                case "https":
                {
                    bindingElement = MetadataExchangeBindings.CreateMexHttpsBinding();
                    //bindingElement = new HttpsTransportBindingElement();
                    break;
                }

                default:
                    throw new ProtocolException("The base address {0} Unable to identify".FormatString(baseAddress.ToString()));
                }
                if (bindingElement != null)
                {
                    //Binding binding = new CustomBinding(bindingElement);
                    ssh.AddServiceEndpoint(typeof(IMetadataExchange), bindingElement, "MEX");
                }
            }
        }
コード例 #2
0
        /// <summary>
        /// 根据WCF元数据创建SpringServiceHost列表
        /// <code>
        /// WCFService wcfservice = new WCFService();
        /// _container.Add(wm, wcfservice.Builder(wm));
        /// </code>
        /// </summary>
        /// <param name="serviceMeta">WCF元数据</param>
        /// <returns>SpringServiceHost列表</returns>
        public List <SpringServiceHost> Builder(WCFServiceMeta serviceMeta)
        {
            WCFServiceMeta = serviceMeta;
            List <SpringServiceHost> ssh = new List <SpringServiceHost>();
            ServiceEndpointElement   metaServiceEndpoint = null;

            try
            {
                foreach (ServiceElement service in serviceMeta.ServicesConfiguration.Services)
                {
                    List <Uri> baseUris = new List <Uri>();
                    foreach (BaseAddressElement ba in service.Host.BaseAddresses)
                    {
                        baseUris.Add(new Uri(ba.BaseAddress));
                    }

                    //ServiceHost sh = new System.ServiceModel.ServiceHost(CreateContactType(service.Name), baseUris.ToArray());
                    //IApplicationContext c = ContextRegistry.GetContext(serviceMeta.ContextName);
                    SpringWebServiceHost sh2 = null;
                    SpringServiceHost    sh  = null;// new SpringServiceHost(service.Name, serviceMeta.ContextName, baseUris.ToArray());
                    // SpringWebServiceHost sh = new WebServiceHost()

                    foreach (ServiceEndpointElement see in service.Endpoints)
                    {
                        Type contactType;
                        if (see.Contract == "IMetadataExchange")
                        {
                            //contactType = typeof(IMetadataExchange);
                            metaServiceEndpoint = see;
                            continue;
                        }
                        else
                        {
                            contactType = CreateContactType(see.Contract);
                        }
                        //ContractDescription cd = ContractDescription.GetContract(contactType);
                        Binding binding = WCFMateHelper.BindingFactory(serviceMeta, see);
                        if (binding is WebHttpBinding)
                        {
                            sh2 = new SpringWebServiceHost(service.Name, serviceMeta.ContextName, baseUris.ToArray());

                            sh2.AddServiceEndpoint(contactType, binding, see.Address);
                        }
                        else
                        {
                            try
                            {
                                sh = new SpringServiceHost(service.Name, serviceMeta.ContextName, baseUris.ToArray());

                                sh.AddServiceEndpoint(contactType, binding, see.Address);
                            }catch (Exception ex)
                            {
                                throw new Exception(string.Format("创建服务失败,WCF配置中的服务名称{0},不能在容器中获取实例", service.Name), ex.InnerException);
                            }
                        }
                    }
                    try
                    {
                        if (sh2 == null)
                        {
                            ServiceDebugBehavior sdb = sh.Description.Behaviors.Find <ServiceDebugBehavior>();
                            {
                                if (sdb != null)
                                {
                                    sdb.IncludeExceptionDetailInFaults = true;
                                }
                                else
                                {
                                    ServiceDebugBehavior sb = new ServiceDebugBehavior();
                                    sb.IncludeExceptionDetailInFaults = true;
                                    sh.Description.Behaviors.Add(sb);
                                }
                            }

                            ServiceMetadataBehavior behavior = sh.Description.Behaviors.Find <ServiceMetadataBehavior>();
                            {
                                CreateMetadataBehavior(sh, behavior, metaServiceEndpoint);
                            }

                            WCFMateHelper.BuildingServiceaBehavior(serviceMeta, service, sh);

                            sh.Faulted += sh_Faulted;
                            sh.UnknownMessageReceived += sh_UnknownMessageReceived;
                            if (sh.State != CommunicationState.Opened)
                            {
                                sh.Open();
                            }
                            ssh.Add(sh);
                        }
                        else
                        {
                            ServiceDebugBehavior sdb = sh2.Description.Behaviors.Find <ServiceDebugBehavior>();
                            {
                                if (sdb != null)
                                {
                                    sdb.IncludeExceptionDetailInFaults = true;
                                }
                                else
                                {
                                    ServiceDebugBehavior sb = new ServiceDebugBehavior();
                                    sb.IncludeExceptionDetailInFaults = true;
                                    sh2.Description.Behaviors.Add(sb);
                                }
                            }
                            sh2.Faulted += sh_Faulted;
                            sh2.UnknownMessageReceived += sh_UnknownMessageReceived;
                            if (sh2.State != CommunicationState.Opened)
                            {
                                sh2.Open();
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        throw new WCFServiceCreateException(Resources.WCFServiceCreateException, ex);
                    }
                }
            }
            catch (Exception serException)
            {
                throw serException;
            }
            return(ssh);
        }