public void Alter() { BrokerService brokerService; ExtendedProperty prop = null; if (this.ServiceBroker.Services.Contains(this.FullName)) { brokerService = this.ServiceBroker.Services[this.FullName]; brokerService.QueueName = this.QueueName; //Drop Contracts that user removed foreach (ServiceContractMapping map in brokerService.ServiceContractMappings) { if (!this.ContractNames.Contains(map.Name)) { if (map.State != SqlSmoState.ToBeDropped) { map.MarkForDrop(true); } } } //Add Contracts that user added foreach (string name in this.ContractNames) { if (!brokerService.ServiceContractMappings.Contains(name)) { ServiceContractMapping brokerServiceContract = new ServiceContractMapping(brokerService, name); brokerService.ServiceContractMappings.Add(brokerServiceContract); } } brokerService.Alter(); //Drop RemoteServiceBinding and Certificate if (!m_EnableRemoteServiceBinding) { if (this.ServiceBroker.RemoteServiceBindings.Contains(this.BindingFullName)) { RemoteServiceBinding binding = this.ServiceBroker. RemoteServiceBindings[this.BindingFullName]; binding.Drop(); } this.DropCertificate(); //Drop extended property if (brokerService.ExtendedProperties.Contains("CertificateName")) { brokerService.ExtendedProperties["CertificateName"].Drop(); } } //Change RemoteServiceBinding if (m_EnableRemoteServiceBinding && !String.IsNullOrEmpty(this.ServiceOwnerName)) { if (this.ServiceBroker.RemoteServiceBindings.Contains(this.BindingFullName)) { RemoteServiceBinding binding = this.ServiceBroker. RemoteServiceBindings[this.BindingFullName]; binding.IsAnonymous = this.AllowAnonymous; //Can't change service owner binding.Owner = this.ServiceOwnerName; binding.Alter(); } } //Create Certificate if EnableRemoteServiceBinding = true and AllowAnonymous = false if (m_EnableRemoteServiceBinding && !String.IsNullOrEmpty(this.ServiceOwnerName) && !this.AllowAnonymous) { if (!brokerService.ExtendedProperties.Contains("CertificateName")) { prop = new ExtendedProperty(brokerService, "CertificateName", this.Certificate.Name); } this.Certificate.Owner = this.ServiceOwnerName; this.Certificate.Create(); } //Create ReportServiceBinding if (m_EnableRemoteServiceBinding && !String.IsNullOrEmpty(this.ServiceOwnerName)) { this.CreateRemoteServiceBinding(); } if (this.GrantReceive) { CreateGrantReceive(); } //Create property last if (prop != null) { prop.Create(); } } }
internal static void DeploySsbObj(object obj, string svrName, string dbName, SsbEnum ssbType, bool isEdit) { Server svr = CreateServer(svrName, null, null); Database db = svr.Databases[dbName]; ServiceBroker sb = db.ServiceBroker; MessageType mt = null; ServiceContract sc = null; ServiceQueue q = null; BrokerService serv = null; ServiceRoute rt = null; RemoteServiceBinding bind = null; try { switch (ssbType) { case SsbEnum.MessageType: MessageType mtNew = new MessageType(); mtNew.Parent = sb; mt = (MessageType)obj; mtNew.Name = mt.Name; mtNew.MessageTypeValidation = mt.MessageTypeValidation; if (mt.MessageTypeValidation == MessageTypeValidation.XmlSchemaCollection) { mtNew.ValidationXmlSchemaCollection = mt.ValidationXmlSchemaCollection; } if (isEdit) { mtNew.Alter(); } else { mtNew.Create(); } break; case SsbEnum.Contract: ServiceContract scNew = new ServiceContract(); sc = (ServiceContract)obj; scNew.Parent = sb; scNew.Name = sc.Name; foreach (MessageTypeMapping mtm in sc.MessageTypeMappings) { if (!sb.MessageTypes.Contains(mtm.Name)) { ServiceBroker sbParent = sc.Parent; MessageType mtp = sbParent.MessageTypes[mtm.Name]; DeploySsbObj(mtp, svrName, dbName, SsbEnum.MessageType, false); } MessageTypeMapping mtmNew = new MessageTypeMapping(); mtmNew.Name = mtm.Name; mtmNew.Parent = scNew; mtmNew.MessageSource = mtm.MessageSource; scNew.MessageTypeMappings.Add(mtmNew); } if (isEdit) { scNew.Alter(); } else { scNew.Create(); } break; case SsbEnum.Queu: q = (ServiceQueue)obj; q.Parent = sb; if (isEdit) { q.Alter(); } else { q.Create(); } break; case SsbEnum.Service: serv = (BrokerService)obj; serv.Parent = sb; if (isEdit) { serv.Alter(); } else { serv.Create(); } break; case SsbEnum.Route: rt = (ServiceRoute)obj; rt.Parent = sb; if (isEdit) { rt.Alter(); } else { rt.Create(); } break; case SsbEnum.RemoteBinding: bind = (RemoteServiceBinding)obj; bind.Parent = sb; if (isEdit) { bind.Alter(); } else { bind.Create(); } break; } } catch (FailedOperationException e) { string err = string.Format("{0}", e.InnerException); //throw; } catch (Exception ex) { string errx = string.Format("{0}", ex.InnerException); } finally { svr.ConnectionContext.Disconnect(); } }