public bool RegisterWithDiscoveryServer()
{
ApplicationConfiguration configuration = string.IsNullOrEmpty(base.Configuration.SourceFilePath) ? base.Configuration : ApplicationConfiguration.Load(new FileInfo(base.Configuration.SourceFilePath), ApplicationType.Server, null, false);
CertificateValidationEventHandler registrationCertificateValidator = new CertificateValidationEventHandler(RegistrationValidator_CertificateValidation);
configuration.CertificateValidator.CertificateValidation += registrationCertificateValidator;
try
{
// try each endpoint.
foreach (ConfiguredEndpoint endpoint in m_registrationEndpoints.Endpoints)
{
RegistrationClient client = null;
try
{
// update from the server.
bool updateRequired = true;
lock (m_registrationLock)
{
updateRequired = endpoint.UpdateBeforeConnect;
}
if (updateRequired)
{
endpoint.UpdateFromServer(m_bindingFactory);
}
lock (m_registrationLock)
{
endpoint.UpdateBeforeConnect = false;
}
// create the client.
client = RegistrationClient.Create(
configuration,
endpoint.Description,
endpoint.Configuration,
m_bindingFactory,
base.InstanceCertificate);
// register the server.
RequestHeader requestHeader = new RequestHeader();
requestHeader.Timestamp = DateTime.UtcNow;
client.OperationTimeout = 10000;
try
{
ExtensionObjectCollection discoveryConfiguration = new ExtensionObjectCollection();
StatusCodeCollection configurationResults = null;
DiagnosticInfoCollection diagnosticInfos = null;
client.RegisterServer2(
requestHeader,
m_registrationInfo,
discoveryConfiguration,
out configurationResults,
out diagnosticInfos);
return true;
}
catch (Exception e)
{
// fall back to calling RegisterServer in case RegisterServer2 fails.
Utils.Trace("RegisterServer2 failed for: {0}. Falling back to RegisterServer. Exception={1}.", endpoint.EndpointUrl, e.Message);
client.RegisterServer(requestHeader, m_registrationInfo);
return true;
}
}
catch (Exception e)
{
Utils.Trace("RegisterServer failed for: {0}. Exception={1}", endpoint.EndpointUrl, e.Message);
}
finally
{
if (client != null)
{
try
{
client.Close();
}
catch (Exception e)
{
Utils.Trace("Could not cleanly close connection with LDS. Exception={0}", e.Message);
}
}
}
}
}
finally
{
if (configuration != null)
{
configuration.CertificateValidator.CertificateValidation -= registrationCertificateValidator;
}
}
return false;
}