2015-10-23 5 views
0

У меня возникла проблема при попытке подключиться к серверу DeltaV OPC .NET с удаленной машины. Однако соединение будет терпеть неудачу каждый раз, и я не мог понять, почему. Вот код, который я написал:Не удалось подключиться к серверу OPC .NET, когда IXiContext.GetXiEncode() используется для построения XiUserInfo

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

ответ

0

У меня есть исходный код для клиента библиотек DLL Xi, поэтому я решил посмотреть на исходный код, и был в состоянии выяснить, где я буду неправильно. Ошибка в методе учетных данных.

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() возвращает экземпляр XiEncode, который имеет два свойства. Публичные RSAP-параметры и GUID. Тем не менее, этот метод также добавляет частные RSAP-параметры в частный словарь в классе XiContext и использует GUID в качестве ключа.

Когда инициализируется XiUserInfo, он шифрует имя пользователя и пароль, которые передаются с открытым ключом. Когда вызывается метод XiContext.Initiate, в стеке вызовов он вызывает метод, который расшифровывает учетные данные, но ему нужен этот GUID из словаря, чтобы получить закрытый ключ. Поэтому свойство Id в xiUserInfo необходимо установить в Id (который имеет GUID) из экземпляра XiEncode.