如何为SCOM SDK设置连接超时

How to set Connection Timeout for SCOM SDK

我有下一个代码:

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;
}

代码运行良好。

但是,如果我的 SCOM 服务器已关闭,则连接需要一分钟才能引发 TimeOut 异常。

我在 ManagementGroupConnectionSettings class 中找到了两个属性 InactivityTimeoutSendReceiveTimeout

我尝试使用这些属性来更改默认 TimeOut 值。

但不幸的是它不起作用。

我也找不到任何关于 SCOM SDK 连接 TimeOut 的文档。

我查看了很多链接:here, here and here...

但是我的问题没有答案...

如何自己设置连接超时?

简答:无法设置连接超时。

长答案。 Microsoft 使用 DuplexChannelFactory class 进行 SDK 数据层连接。 class 有 7 种不同的超时设置:Explaination of different timeout types。 Microsoft 创建 Channel Factory class 实例的实际代码如下:

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()));

他们使用自定义绑定对象 internal class IndigoCustomBinding : Binding,它没有 override/define OpenTimeout 属性,所以这个超时值是原始 Binding 的默认值] class.