Search code examples
c#.netscomsystem-center

How to set Connection Timeout for SCOM SDK


I have next code:

private ManagementGroup ConnectToManagementGroup(string serverName, string domain, string userName, string password)
{
    var settings = new ManagementGroupConnectionSettings(serverName)
    {
        UserName = userName,
        Domain = domain,
        Password = password.ToSecureString()
    };

    var managementGroup = ManagementGroup.Connect(settings);

    if (!managementGroup.IsConnected)
    {
        throw new Exception($"Can't connect to {serverName} SDK service.");
    }

    return managementGroup;
}

The code works fine.

But if my SCOM server is down then connection takes one minute before throwing a TimeOut exception.

I have found two properties InactivityTimeout and SendReceiveTimeout in ManagementGroupConnectionSettings class.

I have tried to use these properties to change default TimeOut value.

But unfortunately it doesn't work.

Also I can't find any documentations about connection TimeOut for SCOM SDK.

I have reviewed many links: here, here and here...

But there was no answer for my issue...

How can I set TimeOut for connection myself?


Solution

  • Short answer: it's not possible to set the connect timeout.

    Long answer. Microsoft uses DuplexChannelFactory class for SDK Data Layer connection. This class has 7 different timeout settings: Explaination of different timeout types. The actual code, Microsoft creates an instance of Channel Factory class is below:

    DuplexChannelFactory<T> duplexChannelFactory = new DuplexChannelFactory<T>((object) this.clientCallback, (Binding) new IndigoCustomBinding(false, this.connectionSettings.SendReceiveTimeout, this.connectionSettings.InactivityTimeout), new EndpointAddress(new Uri(string.Format((IFormatProvider) CultureInfo.InvariantCulture, endpointUri, new object[1]
      {
        (object) this.connectionSettings.ServerName
      })), EndpointIdentity.CreateSpnIdentity(string.Format((IFormatProvider) CultureInfo.InvariantCulture, spn, new object[1]
      {
        (object) this.connectionSettings.ServerName
      })), new AddressHeaderCollection()));
    

    They use custom binding object internal class IndigoCustomBinding : Binding, which doesn't override/define OpenTimeout property, so this timeout value is left defaulted from the original Binding class.