当使用 IXiContext.GetXiEncode() 构造 XiUserInfo 时,与 OPC .NET 服务器的连接失败

A connection to the OPC .NET server fails when IXiContext.GetXiEncode() is used to construct XiUserInfo

我最初在尝试从远程计算机连接到 DeltaV OPC .NET 服务器时遇到了问题。但是,每次连接都会失败,我不知道为什么。这是我写的代码:

public XiUserInfo Credentials(string username, string password)
{
    XiEncode rsaParamater = XiContext.GetXiEncode();
    return new XiUserInfo(RSAparamater.Encode, username, password);
}

public static void CreateContext(XiUserInfo credentials)
{
    ServiceEndpoint sep;
    sep = iEndpointDiscovery.GetServiceEndpointsByBinding("IResourceManagement", typeof(NetTcpBinding)).First();
    if (credentials != null)
    {
        iContext = XiContext.Initiate(sep, iEndpointDiscovery.ServerEntry,
                    300000, (uint)ContextOptions.EnableDataAccess,
                    (uint)System.Threading.Thread.CurrentThread.CurrentCulture.LCID,
                    Guid.NewGuid().ToString(), credentials);
    }
}

我有 Xi 客户端 dll 的源代码,所以我查看了源代码并找出了我哪里出错了。错误在 Credentials 方法中。

private XiUserInfo Credentials( string username, string password)
{
    XiEncode rsaParameter = XiContext.GetXiEncode();
    XiUserInfo xiUserInfo = new XiUserInfo( rsaParaeter.Encode, username, password );
    xiUserInfo.Id = rsaParameter.Id;
    return XiUserInfo;
}

XiContext.GetXiEncode() returns 具有两个属性的 XiEncode 实例。 public RSAParameters 和 GUID。但是,该方法还将私有 RSAParameters 添加到 XiContext class 中的私有字典中,并使用 GUID 作为键。

当 XiUserInfo 被初始化时,它使用 public 密钥对传入的用户名和密码进行加密。当调用 XiContext.Initiate 方法时,在其调用堆栈中,它会调用一个解密凭据的方法,但它需要字典中的 GUID 才能检索私钥。因此,xiUserInfo 中的 Id 属性 需要设置为来自 XiEncode 实例的 Id(具有 GUID)。