134 lines
4.0 KiB
C#
134 lines
4.0 KiB
C#
|
//----------------------------------------------------------------------------
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//----------------------------------------------------------------------------
|
||
|
namespace System.ServiceModel.Channels
|
||
|
{
|
||
|
using System;
|
||
|
using System.Net;
|
||
|
|
||
|
public sealed class RemoteEndpointMessageProperty
|
||
|
{
|
||
|
string address;
|
||
|
int port;
|
||
|
IPEndPoint remoteEndPoint;
|
||
|
IRemoteEndpointProvider remoteEndpointProvider;
|
||
|
InitializationState state;
|
||
|
object thisLock = new object();
|
||
|
|
||
|
public RemoteEndpointMessageProperty(string address, int port)
|
||
|
{
|
||
|
if (string.IsNullOrEmpty(address))
|
||
|
{
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("address");
|
||
|
}
|
||
|
|
||
|
if (port < IPEndPoint.MinPort || port > IPEndPoint.MaxPort)
|
||
|
{
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument("port",
|
||
|
SR.GetString(SR.ValueMustBeInRange, IPEndPoint.MinPort, IPEndPoint.MaxPort));
|
||
|
}
|
||
|
|
||
|
this.port = port;
|
||
|
this.address = address;
|
||
|
this.state = InitializationState.All;
|
||
|
}
|
||
|
|
||
|
internal RemoteEndpointMessageProperty(IRemoteEndpointProvider remoteEndpointProvider)
|
||
|
{
|
||
|
this.remoteEndpointProvider = remoteEndpointProvider;
|
||
|
}
|
||
|
|
||
|
internal RemoteEndpointMessageProperty(IPEndPoint remoteEndPoint)
|
||
|
{
|
||
|
this.remoteEndPoint = remoteEndPoint;
|
||
|
}
|
||
|
|
||
|
public static string Name
|
||
|
{
|
||
|
get { return "System.ServiceModel.Channels.RemoteEndpointMessageProperty"; }
|
||
|
}
|
||
|
|
||
|
public string Address
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if ((this.state & InitializationState.Address) != InitializationState.Address)
|
||
|
{
|
||
|
lock (ThisLock)
|
||
|
{
|
||
|
if ((this.state & InitializationState.Address) != InitializationState.Address)
|
||
|
{
|
||
|
Initialize(false);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return this.address;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public int Port
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if ((this.state & InitializationState.Port) != InitializationState.Port)
|
||
|
{
|
||
|
lock (ThisLock)
|
||
|
{
|
||
|
if ((this.state & InitializationState.Port) != InitializationState.Port)
|
||
|
{
|
||
|
Initialize(true);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return this.port;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
object ThisLock
|
||
|
{
|
||
|
get { return thisLock; }
|
||
|
}
|
||
|
|
||
|
void Initialize(bool getHostedPort)
|
||
|
{
|
||
|
if (remoteEndPoint != null)
|
||
|
{
|
||
|
this.address = remoteEndPoint.Address.ToString();
|
||
|
this.port = remoteEndPoint.Port;
|
||
|
this.state = InitializationState.All;
|
||
|
this.remoteEndPoint = null;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ((this.state & InitializationState.Address) != InitializationState.Address)
|
||
|
{
|
||
|
this.address = remoteEndpointProvider.GetAddress();
|
||
|
this.state |= InitializationState.Address;
|
||
|
}
|
||
|
|
||
|
if (getHostedPort)
|
||
|
{
|
||
|
this.port = remoteEndpointProvider.GetPort();
|
||
|
this.state |= InitializationState.Port;
|
||
|
this.remoteEndpointProvider = null;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal interface IRemoteEndpointProvider
|
||
|
{
|
||
|
string GetAddress();
|
||
|
int GetPort();
|
||
|
}
|
||
|
|
||
|
[Flags]
|
||
|
enum InitializationState
|
||
|
{
|
||
|
None = 0,
|
||
|
Address = 1,
|
||
|
Port = 2,
|
||
|
All = 3
|
||
|
}
|
||
|
}
|
||
|
}
|