|
//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//----------------------------------------------------------------
namespace System.ServiceModel.Discovery
{
using System.Diagnostics.CodeAnalysis;
using System.Runtime;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.Net.Sockets;
[Fx.Tag.XamlVisible(false)]
public class UdpDiscoveryEndpoint : DiscoveryEndpoint
{
[SuppressMessage(FxCop.Category.Security, FxCop.Rule.DoNotDeclareReadOnlyMutableReferenceTypes)]
[SuppressMessage(FxCop.Category.Naming, "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Pv", Justification = "IPv4 is valid.")]
public static readonly Uri DefaultIPv4MulticastAddress = DiscoveryDefaults.Udp.IPv4MulticastAddress;
[SuppressMessage(FxCop.Category.Security, FxCop.Rule.DoNotDeclareReadOnlyMutableReferenceTypes)]
[SuppressMessage(FxCop.Category.Naming, "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Pv", Justification = "IPv6 is valid.")]
public static readonly Uri DefaultIPv6MulticastAddress = DiscoveryDefaults.Udp.IPv6MulticastAddress;
DiscoveryViaBehavior viaBehavior;
UdpTransportSettings udpTransportSettings;
public UdpDiscoveryEndpoint()
: this(GetDefaultMulticastAddress())
{
}
public UdpDiscoveryEndpoint(string multicastAddress)
: this(new Uri(multicastAddress))
{
}
public UdpDiscoveryEndpoint(Uri multicastAddress)
: this(DiscoveryVersion.DefaultDiscoveryVersion, multicastAddress)
{
}
public UdpDiscoveryEndpoint(DiscoveryVersion discoveryVersion)
: this(discoveryVersion, GetDefaultMulticastAddress())
{
}
public UdpDiscoveryEndpoint(DiscoveryVersion discoveryVersion, string multicastAddress)
: this(discoveryVersion, new Uri(multicastAddress))
{
}
public UdpDiscoveryEndpoint(DiscoveryVersion discoveryVersion, Uri multicastAddress)
: base(discoveryVersion, ServiceDiscoveryMode.Adhoc)
{
if (multicastAddress == null)
{
throw FxTrace.Exception.ArgumentNull("multicastAddress");
}
if (discoveryVersion == null)
{
throw FxTrace.Exception.ArgumentNull("discoveryVersion");
}
// Send replies async to maintain performance
base.Behaviors.Add(new DispatcherSynchronizationBehavior { AsynchronousSendEnabled = true });
Initialize(multicastAddress);
}
public Uri MulticastAddress
{
get
{
return this.viaBehavior.Via;
}
set
{
if (value == null)
{
throw FxTrace.Exception.ArgumentNull("value");
}
this.viaBehavior.Via = value;
base.ListenUri = value;
}
}
[Obsolete("TranportSettings property in System.SerivceModel.Discovery.UdpDiscoveryEndpoint is obsolete. Consider using System.ServiceModel.Channels.UdpTransportBindingElement for setting the transport properties.")]
public UdpTransportSettings TransportSettings
{
get
{
return this.udpTransportSettings;
}
}
void Initialize(Uri multicastAddress)
{
this.viaBehavior = new DiscoveryViaBehavior(multicastAddress);
base.ListenUri = multicastAddress;
TextMessageEncodingBindingElement textBE = new TextMessageEncodingBindingElement();
textBE.MessageVersion = base.DiscoveryVersion.Implementation.MessageVersion;
UdpTransportBindingElement udpBE = DiscoveryDefaults.Udp.CreateUdpTransportBindingElement();
this.udpTransportSettings = new UdpTransportSettings(udpBE);
CustomBinding binding = new CustomBinding();
binding.Elements.Add(textBE);
binding.Elements.Add(udpBE);
base.MaxResponseDelay = DiscoveryDefaults.Udp.AppMaxDelay;
base.Address = new EndpointAddress(base.DiscoveryVersion.Implementation.DiscoveryAddress);
base.Binding = binding;
base.Behaviors.Add(this.viaBehavior);
base.Behaviors.Add(new UdpReplyToBehavior(udpBE.Scheme));
base.Behaviors.Add(new UdpContractFilterBehavior());
}
static Uri GetDefaultMulticastAddress()
{
return Socket.OSSupportsIPv4 ? DefaultIPv4MulticastAddress : DefaultIPv6MulticastAddress;
}
}
}
|