Browse Source

ongoing Announcement fixes. Now it accepts messages from .NET AnnouncementClient (does not process them yet).

Atsushi Eno 15 years ago
parent
commit
d015dafabc

+ 12 - 13
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.Version11/MessageContracts11.cs

@@ -44,58 +44,57 @@ namespace System.ServiceModel.Discovery.Version11
 		public const string ResolveAction = NS + "/Resolve";
 		public const string ResolveMatchAction = NS + "/ResolveMatches";
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "Hello", WrapperNamespace = NS)]
 		public class OnlineAnnouncement
 		{
 			[MessageHeader (Name = "AppSequence", Namespace = NS)]
 			public DiscoveryMessageSequence11 MessageSequence { get; set; }
-			[MessageBodyMember (Name = "Hello", Namespace = NS)]
+			[MessageBodyMember]
 			public EndpointDiscoveryMetadata11 EndpointDiscoveryMetadata { get; set; }
 		}
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "Bye", WrapperNamespace = NS)]
 		public class OfflineAnnouncement
 		{
 			[MessageHeader (Name = "AppSequence", Namespace = NS)]
 			public DiscoveryMessageSequence11 MessageSequence { get; set; }
-			[MessageBodyMember (Name = "Bye", Namespace = NS)]
+			[MessageBodyMember]
 			public EndpointDiscoveryMetadata11 EndpointDiscoveryMetadata { get; set; }
 		}
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "Probe", WrapperNamespace = NS)]
 		public class FindRequest
 		{
-			[MessageBodyMember (Name = "Probe", Namespace = NS)]
+			[MessageBodyMember]
 			public FindCriteria11 Body { get; set; }
 		}
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "ProbeMatches", WrapperNamespace = NS)]
 		public class FindResponse
 		{
 			[MessageHeader (Name = "AppSequence", Namespace = NS)]
 			public DiscoveryMessageSequence11 MessageSequence { get; set; }
-			[MessageBodyMember (Name = "ProbeMatches", Namespace = NS)]
+			[MessageBodyMember]
 			public FindResponse11 Body { get; set; }
 		}
 
-		[CollectionDataContract (Name = "ProbeMatches", ItemName = "ProbeMatch", Namespace = NS)]
 		public class FindResponse11 : List<EndpointDiscoveryMetadata11>
 		{
 		}
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "Resolve", WrapperNamespace = NS)]
 		public class ResolveRequest
 		{
-			[MessageBodyMember (Name = "Resolve", Namespace = NS)]
+			[MessageBodyMember]
 			public ResolveCriteria11 Body { get; set; }
 		}
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "ResolveMatches", WrapperNamespace = NS)]
 		public class ResolveResponse
 		{
 			[MessageHeader (Name = "AppSequence", Namespace = NS)]
 			public DiscoveryMessageSequence11 MessageSequence { get; set; }
-			[MessageBodyMember (Name = "ResolveMatches", Namespace = NS)]
+			[MessageBodyMember]
 			public EndpointDiscoveryMetadata11 Body { get; set; }
 		}
 	}

+ 12 - 13
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.VersionApril2005/MessageContractsApril2005.cs

@@ -44,58 +44,57 @@ namespace System.ServiceModel.Discovery.VersionApril2005
 		public const string ResolveAction = NS + "/Resolve";
 		public const string ResolveMatchAction = NS + "/ResolveMatches";
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "Hello", WrapperNamespace = NS)]
 		public class OnlineAnnouncement
 		{
 			[MessageHeader (Name = "AppSequence", Namespace = NS)]
 			public DiscoveryMessageSequenceApril2005 MessageSequence { get; set; }
-			[MessageBodyMember (Name = "Hello", Namespace = NS)]
+			[MessageBodyMember]
 			public EndpointDiscoveryMetadataApril2005 EndpointDiscoveryMetadata { get; set; }
 		}
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "Bye", WrapperNamespace = NS)]
 		public class OfflineAnnouncement
 		{
 			[MessageHeader (Name = "AppSequence", Namespace = NS)]
 			public DiscoveryMessageSequenceApril2005 MessageSequence { get; set; }
-			[MessageBodyMember (Name = "Bye", Namespace = NS)]
+			[MessageBodyMember]
 			public EndpointDiscoveryMetadataApril2005 EndpointDiscoveryMetadata { get; set; }
 		}
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "Probe", WrapperNamespace = NS)]
 		public class FindRequest
 		{
-			[MessageBodyMember (Name = "Probe", Namespace = NS)]
+			[MessageBodyMember]
 			public FindCriteriaApril2005 Body { get; set; }
 		}
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "ProbeMatches", WrapperNamespace = NS)]
 		public class FindResponse
 		{
 			[MessageHeader (Name = "AppSequence", Namespace = NS)]
 			public DiscoveryMessageSequenceApril2005 MessageSequence { get; set; }
-			[MessageBodyMember (Name = "ProbeMatches", Namespace = NS)]
+			[MessageBodyMember]
 			public FindResponseApril2005 Body { get; set; }
 		}
 
-		[CollectionDataContract (Name = "ProbeMatches", ItemName = "ProbeMatch", Namespace = NS)]
 		public class FindResponseApril2005 : List<EndpointDiscoveryMetadataApril2005>
 		{
 		}
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "Resolve", WrapperNamespace = NS)]
 		public class ResolveRequest
 		{
-			[MessageBodyMember (Name = "Resolve", Namespace = NS)]
+			[MessageBodyMember]
 			public ResolveCriteriaApril2005 Body { get; set; }
 		}
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "ResolveMatches", WrapperNamespace = NS)]
 		public class ResolveResponse
 		{
 			[MessageHeader (Name = "AppSequence", Namespace = NS)]
 			public DiscoveryMessageSequenceApril2005 MessageSequence { get; set; }
-			[MessageBodyMember (Name = "ResolveMatches", Namespace = NS)]
+			[MessageBodyMember]
 			public EndpointDiscoveryMetadataApril2005 Body { get; set; }
 		}
 	}

+ 12 - 13
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.VersionCD1/MessageContractsCD1.cs

@@ -44,58 +44,57 @@ namespace System.ServiceModel.Discovery.VersionCD1
 		public const string ResolveAction = NS + "/Resolve";
 		public const string ResolveMatchAction = NS + "/ResolveMatches";
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "Hello", WrapperNamespace = NS)]
 		public class OnlineAnnouncement
 		{
 			[MessageHeader (Name = "AppSequence", Namespace = NS)]
 			public DiscoveryMessageSequenceCD1 MessageSequence { get; set; }
-			[MessageBodyMember (Name = "Hello", Namespace = NS)]
+			[MessageBodyMember]
 			public EndpointDiscoveryMetadataCD1 EndpointDiscoveryMetadata { get; set; }
 		}
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "Bye", WrapperNamespace = NS)]
 		public class OfflineAnnouncement
 		{
 			[MessageHeader (Name = "AppSequence", Namespace = NS)]
 			public DiscoveryMessageSequenceCD1 MessageSequence { get; set; }
-			[MessageBodyMember (Name = "Bye", Namespace = NS)]
+			[MessageBodyMember]
 			public EndpointDiscoveryMetadataCD1 EndpointDiscoveryMetadata { get; set; }
 		}
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "Probe", WrapperNamespace = NS)]
 		public class FindRequest
 		{
-			[MessageBodyMember (Name = "Probe", Namespace = NS)]
+			[MessageBodyMember]
 			public FindCriteriaCD1 Body { get; set; }
 		}
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "ProbeMatches", WrapperNamespace = NS)]
 		public class FindResponse
 		{
 			[MessageHeader (Name = "AppSequence", Namespace = NS)]
 			public DiscoveryMessageSequenceCD1 MessageSequence { get; set; }
-			[MessageBodyMember (Name = "ProbeMatches", Namespace = NS)]
+			[MessageBodyMember]
 			public FindResponseCD1 Body { get; set; }
 		}
 
-		[CollectionDataContract (Name = "ProbeMatches", ItemName = "ProbeMatch", Namespace = NS)]
 		public class FindResponseCD1 : List<EndpointDiscoveryMetadataCD1>
 		{
 		}
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "Resolve", WrapperNamespace = NS)]
 		public class ResolveRequest
 		{
-			[MessageBodyMember (Name = "Resolve", Namespace = NS)]
+			[MessageBodyMember]
 			public ResolveCriteriaCD1 Body { get; set; }
 		}
 
-		[MessageContract (IsWrapped = false)]
+		[MessageContract (WrapperName = "ResolveMatches", WrapperNamespace = NS)]
 		public class ResolveResponse
 		{
 			[MessageHeader (Name = "AppSequence", Namespace = NS)]
 			public DiscoveryMessageSequenceCD1 MessageSequence { get; set; }
-			[MessageBodyMember (Name = "ResolveMatches", Namespace = NS)]
+			[MessageBodyMember]
 			public EndpointDiscoveryMetadataCD1 Body { get; set; }
 		}
 	}

+ 1 - 1
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery/AnnouncementEndpoint.cs

@@ -48,7 +48,7 @@ namespace System.ServiceModel.Discovery
 		}
 
 		public AnnouncementEndpoint (Binding binding, EndpointAddress address)
-			: this (DiscoveryVersion.WSDiscoveryApril2005, binding, address)
+			: this (DiscoveryVersion.WSDiscovery11, binding, address)
 		{
 		}
 

+ 38 - 7
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery/DiscoveryChannelDispatcher.cs

@@ -36,13 +36,15 @@ namespace System.ServiceModel.Discovery
 	{
 		ServiceHostBase host;
 		AnnouncementClient client;
-		bool online;
+		bool handle_announce_online;
 
-		// FIXME: use online flag (to differentiate Hello and Bye dispatchers)
-		public DiscoveryChannelDispatcher (AnnouncementEndpoint endpoint, bool online)
+		public DiscoveryChannelDispatcher (AnnouncementEndpoint endpoint, bool handleAnnounceOnline)
 		{
+			// The argument endpoint is to indicate "destination".
+			// It is different from the destination indicated in 
+			// "EndpointDiscoveryMetadata" argument in announcement messages sent by the "client".
 			this.client = new AnnouncementClient (endpoint);
-			this.online = online;
+			this.handle_announce_online = handleAnnounceOnline;
 		}
 
 		public ICommunicationObject Communication {
@@ -59,12 +61,12 @@ namespace System.ServiceModel.Discovery
 
 		// might be different value
 		protected override TimeSpan DefaultOpenTimeout {
-			get { return TimeSpan.FromMinutes (1); }
+			get { return client.Endpoint.Binding.OpenTimeout; }
 		}
 
 		// might be different value
 		protected override TimeSpan DefaultCloseTimeout {
-			get { return TimeSpan.FromMinutes (1); }
+			get { return client.Endpoint.Binding.CloseTimeout; }
 		}
 
 		protected override void Attach (ServiceHostBase host)
@@ -81,7 +83,21 @@ namespace System.ServiceModel.Discovery
 
 		protected override void OnOpen (TimeSpan timeout)
 		{
+			if (!handle_announce_online)
+				return; // Offline announcement is done by another DiscoveryChannelDispatcher
+
+			DateTime start = DateTime.Now;
 			Communication.Open (timeout);
+
+			// and call AnnouncementOnline().
+			var dx = host.Extensions.Find<DiscoveryServiceExtension> ();
+			// Published endpoints are added by DicoveryEndpointPublisherBehavior, which is added to each ServiceEndpoint in the primary (non-announcement) service.
+			if (dx != null) {
+				foreach (var edm in dx.PublishedEndpoints) {
+					client.InnerChannel.OperationTimeout = timeout - (DateTime.Now - start);
+					client.AnnounceOnline (edm);
+				}
+			}
 		}
 
 		protected override IAsyncResult OnBeginOpen (TimeSpan timeout, AsyncCallback callback, object state)
@@ -96,7 +112,22 @@ namespace System.ServiceModel.Discovery
 
 		protected override void OnClose (TimeSpan timeout)
 		{
-			Communication.Close (timeout);
+			if (handle_announce_online)
+				return; // Offline announcement is done by another DiscoveryChannelDispatcher
+
+			DateTime start = DateTime.Now;
+			// and call AnnouncementOnline().
+			var dx = host.Extensions.Find<DiscoveryServiceExtension> ();
+			// Published endpoints are added by DicoveryEndpointPublisherBehavior, which is added to each ServiceEndpoint in the primary (non-announcement) service.
+			if (dx != null) {
+				foreach (var edm in dx.PublishedEndpoints) {
+					client.InnerChannel.OperationTimeout = timeout - (DateTime.Now - start);
+					client.AnnounceOffline (edm);
+				}
+			}
+
+			// Then close the client.
+			Communication.Close (timeout - (DateTime.Now - start));
 		}
 
 		protected override IAsyncResult OnBeginClose (TimeSpan timeout, AsyncCallback callback, object state)

+ 2 - 0
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery/DiscoveryEndpointPublisherBehavior.cs

@@ -59,6 +59,8 @@ namespace System.ServiceModel.Discovery
 
 		void IEndpointBehavior.ApplyDispatchBehavior (ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
 		{
+		// It is applied to the ServiceEndpoints in the ServiceHost which has ServiceDiscoveryBehavior as one of its service behaviors.
+		// That is, this target endpoint is an endpoint in the target service itself, not for "announcement service".
 			if (endpoint == null)
 				throw new ArgumentNullException ("endpoint");
 			if (endpointDispatcher == null)

+ 1 - 1
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery/EndpointDiscoveryMetadata.cs

@@ -62,7 +62,7 @@ namespace System.ServiceModel.Discovery
 
 			reader.MoveToContent ();
 			if (!reader.IsStartElement ("ProbeMatchType", version.Namespace) || reader.IsEmptyElement)
-				throw new XmlException ("Non-empty ProbeMatchType element is expected");
+				throw new XmlException (String.Format ("Non-empty ProbeMatchType element is expected. Got {2} {0} in {1} namespace instead.", reader.LocalName, reader.NamespaceURI, reader.IsEmptyElement ? "empty" : "non-empty"));
 			reader.ReadStartElement ("ProbeType", version.Namespace);
 
 			// standard members

+ 2 - 1
mcs/class/System.ServiceModel.Discovery/Test/System.ServiceModel.Discovery/ServiceDiscoveryBehaviorTest.cs

@@ -145,6 +145,7 @@ namespace MonoTests.System.ServiceModel.Discovery
 				sb.Validate (host.Description, host);
 				// ... should "validate" not "apply dispatch behavior" do "add host extension" job? I doubt that.
 				var dse = host.Extensions.Find<DiscoveryServiceExtension> ();
+				Assert.IsNotNull (dse, "#2");
 				sb.ApplyDispatchBehavior (host.Description, host);
 
 				// The IEndpointBehavior from ServiceDiscoveryBehavior, when ApplyDispatchBehavior() is invoked, publishes an endpoint.
@@ -152,7 +153,7 @@ namespace MonoTests.System.ServiceModel.Discovery
 
 				host.Open ();
 				try {
-					Assert.AreEqual (state, InspectionBehavior.State, "#2");
+					Assert.AreEqual (state, InspectionBehavior.State, "#3");
 				} finally {
 					host.Close ();
 				}