protected override void InitializeRuntime() { ComPlusServiceHostTrace.Trace(TraceEventType.Information, TraceCode.ComIntegrationServiceHostStartingService, SR.TraceCodeComIntegrationServiceHostStartingService, this.info); try { DispatcherBuilder dispatcherBuilder = new DispatcherBuilder(); dispatcherBuilder.InitializeServiceHost(this.Description, this); } catch (Exception e) { if (System.ServiceModel.DiagnosticUtility.ShouldTraceError) { DiagnosticUtility.EventLog.LogEvent(TraceEventType.Error, (ushort)System.Runtime.Diagnostics.EventLogCategory.ComPlus, (uint)System.Runtime.Diagnostics.EventLogEventId.ComPlusServiceHostStartingServiceError, this.info.AppID.ToString(), this.info.Clsid.ToString(), e.ToString()); } throw; } ComPlusServiceHostTrace.Trace(TraceEventType.Verbose, TraceCode.ComIntegrationServiceHostStartedServiceDetails, SR.TraceCodeComIntegrationServiceHostStartedServiceDetails, this.info, this.Description); ComPlusServiceHostTrace.Trace(TraceEventType.Information, TraceCode.ComIntegrationServiceHostStartedService, SR.TraceCodeComIntegrationServiceHostStartedService, this.info); }
private static void ApplyClientBehavior(ServiceEndpoint serviceEndpoint, ClientRuntime clientRuntime) { // contract behaviors ContractDescription contractDescription = serviceEndpoint.Contract; for (int i = 0; i < contractDescription.Behaviors.Count; i++) { IContractBehavior behavior = contractDescription.Behaviors[i]; behavior.ApplyClientBehavior(contractDescription, serviceEndpoint, clientRuntime); } // endpoint behaviors BindingInformationEndpointBehavior.Instance.ApplyClientBehavior(serviceEndpoint, clientRuntime); for (int i = 0; i < serviceEndpoint.Behaviors.Count; i++) { IEndpointBehavior behavior = serviceEndpoint.Behaviors[i]; behavior.ApplyClientBehavior(serviceEndpoint, clientRuntime); } // operation behaviors DispatcherBuilder.BindOperations(contractDescription, clientRuntime, null); }
internal static ClientRuntime BuildProxyBehavior(ServiceEndpoint serviceEndpoint, out BindingParameterCollection parameters) { parameters = new BindingParameterCollection(); SecurityContractInformationEndpointBehavior.ClientInstance.AddBindingParameters(serviceEndpoint, parameters); AddBindingParameters(serviceEndpoint, parameters); ContractDescription contractDescription = serviceEndpoint.Contract; ClientRuntime clientRuntime = new ClientRuntime(contractDescription.Name, contractDescription.Namespace); clientRuntime.ContractClientType = contractDescription.ContractType; IdentityVerifier identityVerifier = serviceEndpoint.Binding.GetProperty <IdentityVerifier>(parameters); if (identityVerifier != null) { clientRuntime.IdentityVerifier = identityVerifier; } for (int i = 0; i < contractDescription.Operations.Count; i++) { OperationDescription operation = contractDescription.Operations[i]; if (!operation.IsServerInitiated()) { DispatcherBuilder.BuildProxyOperation(operation, clientRuntime); } else { DispatcherBuilder.BuildDispatchOperation(operation, clientRuntime.CallbackDispatchRuntime); } } DispatcherBuilder.ApplyClientBehavior(serviceEndpoint, clientRuntime); return(clientRuntime); }
public bool Equals(DispatcherBuilder.ListenUriInfo other) { if (other == null) { return false; } return (object.ReferenceEquals(this, other) || ((this.listenUriMode == other.listenUriMode) && EndpointAddress.UriEquals(this.listenUri, other.listenUri, true, true))); }
// FIXME: distinguish HTTP and HTTPS in the Url properties. internal void EnsureChannelDispatcher(bool isMex, string scheme, Uri uri, WCFBinding binding) { if (isMex) { instance.WsdlUrl = uri; } else { instance.HelpUrl = uri; } if (dispatchers == null) { dispatchers = new Dictionary <Uri, ChannelDispatcher> (); } else if (dispatchers.ContainsKey(uri)) { var info = dispatchers [uri].Listener.GetProperty <MetadataPublishingInfo> (); if (isMex) { info.SupportsMex = true; } else { info.SupportsHelp = true; } return; } if (binding == null) { switch (scheme) { case "http": binding = MetadataExchangeBindings.CreateMexHttpBinding(); break; case "https": binding = MetadataExchangeBindings.CreateMexHttpsBinding(); break; case "net.tcp": binding = MetadataExchangeBindings.CreateMexTcpBinding(); break; case "net.pipe": binding = MetadataExchangeBindings.CreateMexNamedPipeBinding(); break; } } CustomBinding cb = new CustomBinding(binding) { Name = ServiceMetadataBehaviorHttpGetBinding }; cb.Elements.Find <MessageEncodingBindingElement> ().MessageVersion = MessageVersion.None; ServiceEndpoint se = new ServiceEndpoint(ContractDescription.GetContract(typeof(IHttpGetHelpPageAndMetadataContract)), cb, new EndpointAddress(uri)) { ListenUri = uri, }; var channelDispatcher = new DispatcherBuilder().BuildChannelDispatcher(owner.Description.ServiceType, se, new BindingParameterCollection()); // add HttpGetWsdl to indicate that the ChannelDispatcher is for mex or help. var listener = channelDispatcher.Listener as ChannelListenerBase; if (listener != null) { listener.Properties.Add(new MetadataPublishingInfo() { SupportsMex = isMex, SupportsHelp = !isMex, Instance = instance }); } channelDispatcher.Endpoints [0].DispatchRuntime.InstanceContextProvider = new SingletonInstanceContextProvider(new InstanceContext(owner, instance)); dispatchers.Add(uri, channelDispatcher); owner.ChannelDispatchers.Add(channelDispatcher); }
// FIXME: if the ServiceDescription has a base address (e.g. http://localhost:8080) and HttpGetUrl is empty, it returns UnknownDestination while it is expected to return the HTTP help page. internal void EnsureChannelDispatcher(bool isMex, string scheme, Uri uri, WCFBinding binding) { if (isMex) { instance.WsdlUrl = uri; } else { instance.HelpUrl = uri; } if (dispatchers == null) { dispatchers = new Dictionary <Uri, ChannelDispatcher> (); } else if (dispatchers.ContainsKey(uri)) { return; // already exists (e.g. reached here for wsdl while help is already filled on the same URI.) } if (binding == null) { switch (scheme) { case "http": binding = MetadataExchangeBindings.CreateMexHttpBinding(); break; case "https": binding = MetadataExchangeBindings.CreateMexHttpsBinding(); break; case "net.tcp": binding = MetadataExchangeBindings.CreateMexTcpBinding(); break; case "net.pipe": binding = MetadataExchangeBindings.CreateMexNamedPipeBinding(); break; } } CustomBinding cb = new CustomBinding(binding) { Name = ServiceMetadataBehaviorHttpGetBinding }; cb.Elements.Find <MessageEncodingBindingElement> ().MessageVersion = MessageVersion.None; ServiceEndpoint se = new ServiceEndpoint(ContractDescription.GetContract(typeof(IHttpGetHelpPageAndMetadataContract)), cb, new EndpointAddress(uri)) { ListenUri = uri, }; var channelDispatcher = new DispatcherBuilder(Owner).BuildChannelDispatcher(owner.Description.ServiceType, se, new BindingParameterCollection()); channelDispatcher.MessageVersion = MessageVersion.None; // it has no MessageVersion. channelDispatcher.IsMex = true; channelDispatcher.Endpoints [0].DispatchRuntime.InstanceContextProvider = new SingletonInstanceContextProvider(new InstanceContext(owner, instance)); dispatchers.Add(uri, channelDispatcher); owner.ChannelDispatchers.Add(channelDispatcher); }