浏览代码

2009-08-11 Atsushi Enomoto <[email protected]>

	* MetadataResolver.cs : added remaining methods.
	* MetadataExchangeClient.cs : a bit of required changes for above.


svn path=/trunk/mcs/; revision=139691
Atsushi Eno 16 年之前
父节点
当前提交
37d821ea9f

+ 5 - 0
mcs/class/System.ServiceModel/System.ServiceModel.Description/ChangeLog

@@ -1,3 +1,8 @@
+2009-08-11  Atsushi Enomoto  <[email protected]>
+
+	* MetadataResolver.cs : added remaining methods.
+	* MetadataExchangeClient.cs : a bit of required changes for above.
+
 2009-08-11  Atsushi Enomoto  <[email protected]>
 
 	* ServiceDebugBehavior.cs, ServiceMetadataBehavior.cs :

+ 6 - 8
mcs/class/System.ServiceModel/System.ServiceModel.Description/MetadataExchangeClient.cs

@@ -46,21 +46,18 @@ using SMMessage = System.ServiceModel.Channels.Message;
 
 namespace System.ServiceModel.Description
 {
-	[MonoTODO]
+	[MonoTODO ("MetadataExchangeClientMode is not considered")]
 	public class MetadataExchangeClient
 	{
 		string scheme;
 
 		EndpointAddress address;
 		SMBinding binding;
+		MetadataExchangeClientMode mode = MetadataExchangeClientMode.MetadataExchange;
 
+		[MonoTODO ("use empty configuration")]
 		public MetadataExchangeClient ()
 		{
-			//FIXME: Look for config element, implementing
-			//	IMetadataExchange contract
-			//	Use Channel<IMetadataExchange> .. ?
-			
-			throw new NotImplementedException ();
 		}
 
 		public MetadataExchangeClient (SMBinding mexBinding)
@@ -81,6 +78,7 @@ namespace System.ServiceModel.Description
 		public MetadataExchangeClient (Uri address, MetadataExchangeClientMode mode)
 		{
 			this.address = new EndpointAddress (address.AbsoluteUri);
+			this.mode = mode;
 		}
 
 		public MetadataSet GetMetadata ()
@@ -91,7 +89,7 @@ namespace System.ServiceModel.Description
 		public MetadataSet GetMetadata (EndpointAddress address)
 		{
 			//FIXME: default mode?
-			return GetMetadataInternal (address, MetadataExchangeClientMode.MetadataExchange);
+			return GetMetadataInternal (address, mode);
 		}
 
 		public MetadataSet GetMetadata (Uri address, MetadataExchangeClientMode mode)
@@ -99,7 +97,7 @@ namespace System.ServiceModel.Description
 			return GetMetadataInternal (new EndpointAddress (address.AbsoluteUri), mode);
 		}
 
-		MetadataSet GetMetadataInternal (EndpointAddress address, MetadataExchangeClientMode mode)
+		internal MetadataSet GetMetadataInternal (EndpointAddress address, MetadataExchangeClientMode mode)
 		{
 			if (binding == null)
 				binding = MetadataExchangeBindings.CreateMexHttpBinding ();

+ 54 - 34
mcs/class/System.ServiceModel/System.ServiceModel.Description/MetadataResolver.cs

@@ -47,17 +47,57 @@ namespace System.ServiceModel.Description
 	[MonoTODO]
 	public static class MetadataResolver
 	{
-		public static ServiceEndpointCollection Resolve (
-				Type contract,
-				EndpointAddress address)
+		static IEnumerable<ContractDescription> ToContracts (Type contract)
 		{
 			if (contract == null)
 				throw new ArgumentNullException ("contract");
+			yield return ContractDescription.GetContract (contract);
+		}
+
+		public static IAsyncResult BeginResolve (Type contract, EndpointAddress address, AsyncCallback callback, object asyncState)
+		{
+			return BeginResolve (ToContracts (contract), address, callback, asyncState);
+		}
+
+		public static IAsyncResult BeginResolve (IEnumerable<ContractDescription> contracts, EndpointAddress address, AsyncCallback callback, object asyncState)
+		{
+			return BeginResolve (contracts, address, MetadataExchangeClientMode.MetadataExchange, callback, asyncState);
+		}
+
+		public static IAsyncResult BeginResolve (Type contract, Uri address, MetadataExchangeClientMode mode, AsyncCallback callback, object asyncState)
+		{
+			return BeginResolve (ToContracts (contract), new EndpointAddress (address), mode, callback, asyncState);
+		}
+
+		public static IAsyncResult BeginResolve (IEnumerable<ContractDescription> contracts, EndpointAddress address, MetadataExchangeClientMode mode, AsyncCallback callback, object asyncState)
+		{
+			return BeginResolve (contracts, address, mode, new MetadataExchangeClient (), callback, asyncState);
+		}
+
+		public static IAsyncResult BeginResolve (Type contract, EndpointAddress address, MetadataExchangeClient client, AsyncCallback callback, object asyncState)
+		{
+			return resolver.BeginInvoke (ToContracts (contract), () => client.GetMetadata (address), callback, asyncState);
+		}
+
+		public static IAsyncResult BeginResolve (IEnumerable<ContractDescription> contracts, EndpointAddress address, MetadataExchangeClientMode mode, MetadataExchangeClient client, AsyncCallback callback, object asyncState)
+		{
+			return resolver.BeginInvoke (contracts, () => client.GetMetadataInternal (address, mode), callback, asyncState);
+		}
+
+		delegate ServiceEndpointCollection Resolver (IEnumerable<ContractDescription> contracts, Func<MetadataSet> metadataGetter);
+
+		static readonly Resolver resolver = new Resolver (ResolveContracts);
 
-			return ResolveContracts (
-					new ContractDescription [] {ContractDescription.GetContract (contract)},
-					address, 
-					MetadataExchangeClientMode.MetadataExchange);
+		public static ServiceEndpointCollection EndResolve (IAsyncResult result)
+		{
+			return resolver.EndInvoke (result);
+		}
+
+		public static ServiceEndpointCollection Resolve (
+				Type contract,
+				EndpointAddress address)
+		{
+			return Resolve (ToContracts (contract), address);
 		}
 
 		public static ServiceEndpointCollection Resolve (
@@ -65,17 +105,14 @@ namespace System.ServiceModel.Description
 				Uri address,
 				MetadataExchangeClientMode mode)
 		{
-			return ResolveContracts (
-					new ContractDescription [] {ContractDescription.GetContract (contract)},
-					address, 
-					mode);
+			return Resolve (ToContracts (contract), address, mode);
 		}
 
 		public static ServiceEndpointCollection Resolve (
 				IEnumerable<ContractDescription> contracts,
 				EndpointAddress address)
 		{
-			return ResolveContracts (contracts, address, MetadataExchangeClientMode.MetadataExchange);
+			return Resolve (contracts, address, new MetadataExchangeClient ());
 		}
 
 		public static ServiceEndpointCollection Resolve (
@@ -83,7 +120,7 @@ namespace System.ServiceModel.Description
 				Uri address,
 				MetadataExchangeClientMode mode)
 		{
-			return ResolveContracts (contracts, address, mode);
+			return Resolve (contracts, new EndpointAddress (address), new MetadataExchangeClient (address, mode));
 		}
 
 		public static ServiceEndpointCollection Resolve (
@@ -94,8 +131,7 @@ namespace System.ServiceModel.Description
 			if (client == null)
 				throw new ArgumentNullException ("client");
 
-			/* FIXME: client is used for what? */
-			return ResolveContracts (contracts, address, MetadataExchangeClientMode.MetadataExchange);
+			return ResolveContracts (contracts, () => client.GetMetadata (address));
 		}
 
 		/* FIXME: What is the mode/client used for here? 
@@ -109,24 +145,12 @@ namespace System.ServiceModel.Description
 			if (client == null)
 				throw new ArgumentNullException ("client");
 
-			return ResolveContracts (contracts, address, mode);
+			return ResolveContracts (contracts, () => new MetadataExchangeClient ().GetMetadata (address, mode));
 		}
 
 		private static ServiceEndpointCollection ResolveContracts (
 				IEnumerable<ContractDescription> contracts,
-				Uri address,
-				MetadataExchangeClientMode mode)
-		{
-			if (address == null)
-				throw new ArgumentNullException ("address");
-
-			return ResolveContracts (contracts, new EndpointAddress (address), mode);
-		}
-
-		private static ServiceEndpointCollection ResolveContracts (
-				IEnumerable<ContractDescription> contracts,
-				EndpointAddress address,
-				MetadataExchangeClientMode mode)
+				Func<MetadataSet> metadataGetter)
 		{
 			if (contracts == null)
 				throw new ArgumentNullException ("contracts");
@@ -135,11 +159,7 @@ namespace System.ServiceModel.Description
 			if (list.Count == 0)
 				throw new ArgumentException ("There must be atleast one ContractDescription", "contracts");
 
-			if (address == null)
-				throw new ArgumentNullException ("address");
-
-			MetadataExchangeClient client = new MetadataExchangeClient (address);
-			MetadataSet metadata = client.GetMetadata ();
+			MetadataSet metadata = metadataGetter ();
 			WsdlImporter importer = new WsdlImporter (metadata);
 			ServiceEndpointCollection endpoints = importer.ImportAllEndpoints ();