public DiscoveryClientBindingElement ()
{
+ DiscoveryEndpointProvider = DiscoveryEndpointProvider.CreateDefault ();
+ FindCriteria = new FindCriteria (); // empty
}
public DiscoveryClientBindingElement (DiscoveryEndpointProvider discoveryEndpointProvider, FindCriteria findCriteria)
public override T GetProperty<T> (BindingContext context)
{
- throw new NotImplementedException ();
+ return context.GetInnerProperty<T> ();
}
}
}
{
public abstract class DiscoveryEndpointProvider
{
+ internal static DiscoveryEndpointProvider CreateDefault ()
+ {
+ return new UdpDiscoveryEndpointProvider ();
+ }
+
public abstract DiscoveryEndpoint GetDiscoveryEndpoint ();
}
[MonoTODO]
public class DiscoveryOperationContextExtension : IExtension<OperationContext>
{
- internal DiscoveryOperationContextExtension ()
+ internal DiscoveryOperationContextExtension (DiscoveryEndpoint endpoint)
{
+ this.endpoint = endpoint;
+ }
+
+ DiscoveryEndpoint endpoint;
+
+ public ServiceDiscoveryMode DiscoveryMode {
+ get { return endpoint.DiscoveryMode; }
+ }
+
+ public DiscoveryVersion DiscoveryVersion {
+ get { return endpoint.DiscoveryVersion; }
+ }
+
+ public TimeSpan MaxResponseDelay {
+ get { return endpoint.MaxResponseDelay; }
+ internal set { endpoint.MaxResponseDelay = value; }
}
void IExtension<OperationContext>.Attach (OperationContext owner)
namespace System.ServiceModel.Discovery
{
- [MonoTODO]
public class DynamicEndpoint : ServiceEndpoint
{
public DynamicEndpoint (ContractDescription contract, Binding binding)
- : base (contract, binding, new EndpointAddress ("http://schemas.microsoft.com/discovery/dynamic"))
+ : base (contract, CreateBinding (binding), new EndpointAddress ("http://schemas.microsoft.com/discovery/dynamic"))
{
if (binding == null)
throw new ArgumentNullException ("binding");
- DiscoveryEndpointProvider = new UdpDiscoveryEndpointProvider ();
+ DiscoveryEndpointProvider = DiscoveryEndpointProvider.CreateDefault ();
FindCriteria = new FindCriteria (contract.ContractType);
}
+ static CustomBinding CreateBinding (Binding source)
+ {
+ var bec = source.CreateBindingElements ();
+ bec.Insert (0, new DiscoveryClientBindingElement ());
+ return new CustomBinding (bec);
+ }
+
public DiscoveryEndpointProvider DiscoveryEndpointProvider { get; set; }
public FindCriteria FindCriteria { get; set; }
}
System.ServiceModel.Discovery/EndpointDiscoveryMetadataTest.cs
System.ServiceModel.Discovery/FindCriteriaTest.cs
System.ServiceModel.Discovery/InspectionBehaviors.cs
+System.ServiceModel.Discovery/MyDiscoveryServiceTypes.cs
System.ServiceModel.Discovery/ServiceDiscoveryBehaviorTest.cs
System.ServiceModel.Discovery/UdpAnnouncementEndpointTest.cs
System.ServiceModel.Discovery/UdpDiscoveryEndpointTest.cs
Assert.AreEqual (new UdpDiscoveryEndpoint ().MulticastAddress, die.ListenUri, "#7");
Assert.AreEqual (ListenUriMode.Explicit, die.ListenUriMode, "#8");
Assert.AreEqual (5, die.Behaviors.Count, "#9");
+
+ // default constructor
+ be = new DiscoveryClientBindingElement ();
+ Assert.IsNotNull (be.FindCriteria, "#11");
+ Assert.IsNotNull (be.DiscoveryEndpointProvider, "#12");
}
[Test]
Assert.IsTrue (be.CanBuildChannelFactory<IRequestChannel> (bc), "#2");
Assert.IsFalse (be.CanBuildChannelFactory<IDuplexSessionChannel> (bc), "#3");
}
+
+ [Test]
+ public void GetProperty ()
+ {
+ var de = CreateDynamicEndpoint ();
+ // it is channel dependent - i.e. this binding element does not affect.
+ var be = new DiscoveryClientBindingElement ();
+ var bc = new BindingContext (new CustomBinding (new HttpTransportBindingElement ()), new BindingParameterCollection ());
+ // so, they are not part of GetProperty<T>() return values.
+ Assert.IsNull (be.GetProperty<FindCriteria> (bc), "#1");
+ Assert.IsNull (be.GetProperty<DiscoveryEndpointProvider> (bc), "#2");
+
+ Assert.IsNull (be.GetProperty<DiscoveryEndpoint> (bc), "#3");
+ }
}
}
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
+using System.Linq;
+using System.Net.Sockets;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
Assert.AreEqual (1, fc.ContractTypeNames.Count, "#2-2");
Assert.AreEqual (0, fc.Scopes.Count, "#2-3");
Assert.AreEqual (0, fc.Extensions.Count, "#2-4");
- Assert.IsNotNull (de.DiscoveryEndpointProvider, "#3");
+
+ var dep = de.DiscoveryEndpointProvider;
+ Assert.IsNotNull (dep, "#3");
+ var dise = dep.GetDiscoveryEndpoint ();
+ TestDiscoveryEndpoint (dise);
+
+ Assert.IsNotNull (de.Contract, "#11"); // for ITestService
+ Assert.AreEqual ("http://tempuri.org/", de.Contract.Namespace, "#11-2");
+ Assert.AreEqual ("ITestService", de.Contract.Name, "#11-3");
+ Assert.IsNotNull (de.Binding, "#12"); // Custom{DiscoveryClient|BasicHttpBinding-elements}
+ Assert.IsNotNull (de.Binding.CreateBindingElements ().FirstOrDefault (be => be is DiscoveryClientBindingElement), "#12-2");
+ Assert.IsNotNull (de.Binding.CreateBindingElements ().FirstOrDefault (be => be is HttpTransportBindingElement), "#12-3");
+ Assert.IsNotNull (de.Address, "#13");
+ Assert.AreEqual (DiscoveryClientBindingElement.DiscoveryEndpointAddress, de.Address, "#13-2");
+ Assert.AreEqual (DiscoveryClientBindingElement.DiscoveryEndpointAddress.Uri, de.ListenUri, "#14");
+ Assert.AreEqual (0, de.Behaviors.Count, "#15");
+ }
+
+ // copied from UdpDiscoveryEndpointTest.
+ public void TestDiscoveryEndpoint (DiscoveryEndpoint de)
+ {
+ Assert.AreEqual (DiscoveryVersion.WSDiscovery11, de.DiscoveryVersion, "#1");
+ Assert.AreEqual (ServiceDiscoveryMode.Adhoc, de.DiscoveryMode, "#2");
+ Assert.AreEqual (TimeSpan.FromMilliseconds (500), de.MaxResponseDelay, "#3");
+ var cd = de.Contract;
+ Assert.IsNotNull (cd, "#11");
+ Assert.IsNotNull (de.Binding, "#12");
+ TransportBindingElement tbe;
+ Assert.IsTrue (de.Binding.CreateBindingElements ().Any (be => (tbe = be as TransportBindingElement) != null && tbe.Scheme == "soap.udp"), "#12-2");
+ Assert.IsNotNull (de.Address, "#13");
+ Assert.AreEqual (DiscoveryVersion.WSDiscovery11.AdhocAddress, de.Address.Uri, "#13-2");
+ Assert.AreEqual (Socket.SupportsIPv4 ? UdpDiscoveryEndpoint.DefaultIPv4MulticastAddress : UdpDiscoveryEndpoint.DefaultIPv6MulticastAddress, de.ListenUri, "#14");
}
}
}
--- /dev/null
+//
+// Author: Atsushi Enomoto <atsushi@ximian.com>
+//
+// Copyright (C) 2010 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ServiceModel;
+using System.ServiceModel.Channels;
+using System.ServiceModel.Description;
+using System.ServiceModel.Discovery;
+using System.ServiceModel.Dispatcher;
+using NUnit.Framework;
+
+namespace System.ServiceModel.Discovery
+{
+ public class MyServiceDiscoveryBehavior : ServiceDiscoveryBehavior, IServiceBehavior
+ {
+ IServiceBehavior GetBase ()
+ {
+ var sdb = (ServiceDiscoveryBehavior) this;
+ return (IServiceBehavior) sdb;
+ }
+
+ void IServiceBehavior.AddBindingParameters (ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
+ {
+ GetBase ().AddBindingParameters (serviceDescription, serviceHostBase, endpoints, bindingParameters);
+ }
+
+ void IServiceBehavior.ApplyDispatchBehavior (ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
+ {
+ GetBase ().ApplyDispatchBehavior (serviceDescription, serviceHostBase);
+ }
+
+ void IServiceBehavior.Validate (ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
+ {
+ if (serviceHostBase == null)
+ throw new ArgumentNullException ("serviceHostBase");
+ var dse = serviceHostBase.Extensions.Find<DiscoveryServiceExtension> ();
+ if (dse == null) {
+ dse = new MyDiscoveryServiceExtension ();
+ serviceHostBase.Extensions.Add (dse);
+ }
+
+ GetBase ().Validate (serviceDescription, serviceHostBase);
+ }
+ }
+
+ public class MyDiscoveryServiceExtension : DiscoveryServiceExtension
+ {
+ protected override DiscoveryService GetDiscoveryService ()
+ {
+ return new MyDiscoveryService ();
+ }
+ }
+
+ public class MyDiscoveryService : DiscoveryService
+ {
+ protected override IAsyncResult OnBeginFind (FindRequestContext findRequestContext, AsyncCallback callback, Object state)
+ {
+ Console.Error.WriteLine ("OnBeginFind");
+ throw new Exception ("1");
+ }
+
+ protected override IAsyncResult OnBeginResolve (ResolveCriteria resolveCriteria, AsyncCallback callback, Object state)
+ {
+ Console.Error.WriteLine ("OnBeginResolve");
+ throw new Exception ("2");
+ }
+
+ protected override void OnEndFind (IAsyncResult result)
+ {
+ Console.Error.WriteLine ("OnEndFind");
+ throw new Exception ("3");
+ }
+
+ protected override EndpointDiscoveryMetadata OnEndResolve (IAsyncResult result)
+ {
+ Console.Error.WriteLine ("OnEndResolve");
+ throw new Exception ("4");
+ }
+ }
+}