コード例 #1
0
		internal object DiscoverChannel(DiscoveredEndpointModel model, IChannelBuilderScope scope)
		{
			var discovered = PerformEndpointSearch(scope.Contract, model);

			if (discovered == null || discovered.Endpoints.Count == 0)
			{
				throw new EndpointNotFoundException(string.Format(
					"Unable to discover the endpoint for contract {0}.  " +
					"Either no service exists or it does not support discovery.",
					scope.Contract.FullName));
			}

			var binding = model.Binding;
			var endpointMetadata = discovered.Endpoints[0];
			if (discovered.Endpoints.Count > 1 && model.EndpointPreference != null)
			{
				endpointMetadata = model.EndpointPreference(discovered.Endpoints);
				if (endpointMetadata == null)
				{
					throw new EndpointNotFoundException(string.Format(
						"More than one endpoint was discovered for contract {0}.  " +
						"However, an endpoint was not selected.  This is most likely " +
						"a bug with the user-defined endpoint preference.",
						scope.Contract.FullName));
				}
			}

			if (binding == null && model.DeriveBinding == false)
			{
				binding = GetBindingFromMetadata(endpointMetadata);
			}

			var address = endpointMetadata.Address;
			if (model.Identity != null)
			{
				address = new EndpointAddress(address.Uri, model.Identity, address.Headers);
			}

			binding = GetEffectiveBinding(binding, address.Uri);

			var channel = scope.GetChannel(scope.Contract, binding, address)();

			if (channel is IContextChannel)
			{
				var metadata = new DiscoveredEndpointMetadata(endpointMetadata);
				((IContextChannel)channel).Extensions.Add(metadata);
			}

			return channel;
		}
コード例 #2
0
		private FindResponse PerformEndpointSearch(Type contract, DiscoveredEndpointModel model)
		{
			var criteria = CreateSearchCriteria(contract, model);

			for (int i = 0; i < 2; ++i)
			{
				var discoveryEndpoint = GetDiscoveryEndpoint(model);
				WcfBindingUtils.ConfigureQuotas(discoveryEndpoint.Binding, int.MaxValue);
				var discoveryClient = new DiscoveryClient(discoveryEndpoint);

				try
				{
					return discoveryClient.Find(criteria);
				}
				catch 
				{
					// ignore failures
				}
				finally
				{
					try
					{
						discoveryClient.Close();
					}
					catch 
					{
						// Discovery client often fails on close
					}
				}

				// Possible stale discovery proxy...

				if (i == 0)
				{
					var discoveryEndpointFaulted = DiscoveryEndpointFaulted;
					if (discoveryEndpointFaulted != null)
					{
						discoveryEndpointFaulted(this, new DiscoveryEndpointFaultEventArgs(discoveryEndpoint));
					}
				}
			}

			return null;
		}
			void IWcfEndpointVisitor.VisitBindingDiscoveredEndpoint(DiscoveredEndpointModel model)
			{
				throw new InvalidOperationException("Discovered endpoints can only by applied for clients.");
			}
コード例 #4
0
		private FindCriteria CreateSearchCriteria(DiscoveredEndpointModel model)
		{
			var searchContract = model.SearchContract ?? contract;
			var criteria = new FindCriteria(searchContract) { MaxResults = model.MaxResults };

			if (model.Duration.HasValue)
			{
				criteria.Duration = model.Duration.Value;
			}

			var discovery = model.Extensions.OfType<WcfInstanceExtension>()
				.Select(extension => extension.Instance)
				.OfType<EndpointDiscoveryBehavior>()
				.FirstOrDefault();

			if (discovery != null)
			{
				criteria.Scopes.AddAll(discovery.Scopes);

				if (model.ScopeMatchBy != null)
				{
					criteria.ScopeMatchBy = model.ScopeMatchBy;
				}

				criteria.Extensions.AddAll(discovery.Extensions);
			}

			return criteria;
		}
コード例 #5
0
		private void DiscoverEndpoint(DiscoveryEndpoint discoveryEndpoint, DiscoveredEndpointModel model)
		{
			using (var discover = new DiscoveryClient(discoveryEndpoint))
			{
				var criteria = CreateSearchCriteria(model);

				var discovered = discover.Find(criteria);
				if (discovered.Endpoints.Count > 0)
				{
					var binding = model.Binding;
					var endpointMetadata = discovered.Endpoints[0];
					if (discovered.Endpoints.Count > 1 && model.EndpointPreference != null)
					{
						endpointMetadata = model.EndpointPreference(discovered.Endpoints);
						if (endpointMetadata == null)
						{
							throw new EndpointNotFoundException(string.Format(
								"More than one endpoint was discovered for contract {0}.  " +
								"However, an endpoint could be selected.  This is most likely " +
								"a bug with the user-defined endpoint prefeence.",
								contract.FullName));
						}
					}

					if (binding == null && model.DeriveBinding == false)
					{
						binding = GetBindingFromMetadata(endpointMetadata);
					}
					
					var address = endpointMetadata.Address;
					if (model.Identity != null)
					{
						address = new EndpointAddress(address.Uri, model.Identity, address.Headers);
					}

					binding = GetEffectiveBinding(binding, address.Uri);
					var innerCreator = GetChannel(contract, binding, address);
					channelCreator = () =>
					{
						var channel = (IChannel)innerCreator();
						if (channel is IContextChannel)
						{
							var metadata = new DiscoveredEndpointMetadata(endpointMetadata);
							((IContextChannel)channel).Extensions.Add(metadata);
						}
						return channel;
					};
				}
				else
				{
					throw new EndpointNotFoundException(string.Format(
						"Unable to discover the endpoint for contract {0}.  " + 
						"Either no service exists or it does not support discovery.",
						contract.FullName));
				}
			}
		}
コード例 #6
0
		void IWcfEndpointVisitor.VisitBindingDiscoveredEndpoint(DiscoveredEndpointModel model)
		{
			var discoveryEndpoint = model.DiscoveryEndpoint ?? new UdpDiscoveryEndpoint();
			DiscoverEndpoint(discoveryEndpoint, model);
		}
コード例 #7
0
		private static FindCriteria CreateSearchCriteria(Type contract, DiscoveredEndpointModel model)
		{
			var searchContract = model.SearchContract ?? contract;
			var criteria = model.SearchAnyContract ? new FindCriteria() : new FindCriteria(searchContract);
			criteria.Duration = model.Duration.GetValueOrDefault(DefaultDuration);
			criteria.MaxResults = model.MaxResults;

			var discovery = model.Extensions.OfType<WcfInstanceExtension>()
				.Select(extension => extension.Instance)
				.OfType<WcfEndpointDiscoveryMetadata>()
				.FirstOrDefault();

			if (discovery != null)
			{
				criteria.Scopes.AddAll(discovery.Scopes);

				if (model.ScopeMatchBy != null)
				{
					criteria.ScopeMatchBy = model.ScopeMatchBy;
				}

				criteria.Extensions.AddAll(discovery.Extensions);
			}

			return criteria;
		}
コード例 #8
0
		private DiscoveryEndpoint GetDiscoveryEndpoint(DiscoveredEndpointModel model)
		{
			if (model.DiscoveryEndpoint != null)
			{
				return model.DiscoveryEndpoint;
			}

			var provider = model.DiscoveryEndpointProvider ?? DiscoveryEndpointProvider;

			if (provider != null)
			{
				var discoveryEndpoint = provider.GetDiscoveryEndpoint();
				if (discoveryEndpoint != null)
				{
					return discoveryEndpoint;
				}
			}

			return new UdpDiscoveryEndpoint();
		}
コード例 #9
0
		private void DiscoverEndpoint(DiscoveryEndpoint discoveryEndpoint, DiscoveredEndpointModel model)
		{
			using (var discover = new DiscoveryClient(discoveryEndpoint))
			{
				var criteria = CreateSearchCriteria(model);

				var discovered = discover.Find(criteria);
				if (discovered.Endpoints.Count > 0)
				{
					var binding = model.Binding;
					var endpointMetadata = discovered.Endpoints[0];

					if (binding == null && model.DeriveBinding == false)
					{
						binding = GetBindingFromMetadata(endpointMetadata);					
					}
					
					var address = endpointMetadata.Address;
					binding = GetEffectiveBinding(binding, address.Uri);
					channelCreator = GetChannel(contract, binding, address);
				}
				else
				{
					throw new EndpointNotFoundException(string.Format(
						"Unable to discover the endpoint address for contract {0}.  " + 
						"Either no service exists or it does not support discovery.",
						contract.FullName));
				}
			}
		}