Connecting to a PI AF Server
- Last UpdatedNov 18, 2025
- 8 minute read
- PI System
- AF SDK 2024 R2
- Developer
This topic contains the following sections:
- Implicit Connection
- Implicit Connection Using OpenId
- Explicit Connection
- Explicit Connection Using OpenId
- Collective Connection
- Multi-User Connection
- See Also
There are several methods for connecting to a PI AF Server. The AF SDK will handle caching objects and connections to the server, therefore you should only close a connection when you are through using the server for a long period of time. This is different from typical programming against a database where you open a connect, get the data, and then close the connection.
When programming in a multi-user environment where the user identity could change between calls, you must not re-use any AF SDK objects between calls and get new objects starting with the PISystems collection each time. The AF SDK maintains a cache of objects and connections per user which is determined by the obtained PISystems collection for the current user.
Implicit Connection
1// Get the PISystem once and share within the application. 2if (staticPISystem == null) 3 staticPISystem = new PISystems().DefaultPISystem; 4 5// Do operation, a connection will automatically be created if needed for this user. 6AFValue myValue = null; 7AFAttribute myAttribute = AFAttribute.FindAttribute(@"MyDatabase\Element#1|Attribute#1", staticPISystem); 8if (myAttribute != null) 9 myValue = myAttribute.GetValue();
1' Get the PISystem once and share within the application. 2If (sharedPISystem Is Nothing) Then 3 sharedPISystem = New PISystems().DefaultPISystem 4End If 5 6' Do operation, a connection will automatically be created if needed for this user. 7Dim myValue As AFValue = Nothing 8Dim myAttribute As AFAttribute = AFAttribute.FindAttribute("MyDatabase\Element#1|Attribute#1", sharedPISystem) 9If (Not (myAttribute) Is Nothing) Then 10 myValue = myAttribute.GetValue 11End If
No code example is currently available or this language may not be supported.
No code example is currently available or this language may not be supported.
Implicit Connection Using OpenId
1ClaimsIdentity testAccountIdentity = new ClaimsIdentity(); 2testAccountIdentity = new ClaimsIdentity(); 3testAccountIdentity.AddClaim(new Claim("id", TestAccountName)); 4testAccountIdentity.AddClaim(new Claim("access_token", TestAccountAccessToken)); 5 6PISystems myPISystems = new PISystems(testAccountIdentity); 7 8PISystem piSystem = myPISystems.DefaultPISystem; 9string piSystemName = piSystem.ConnectionInfo.Host; 10 11// implicit connection using Claims Identity specified by PISystems constructor 12AFDatabase afdb = piSystem.Databases[myAFDatabase]; 13if (afdb is null) 14 afdb = piSystem.Databases.Add(myAFDatabase); 15AFElement element = afdb.Elements[myAFElement]; 16if (element is null) 17 element = afdb.Elements.Add(myAFElement); 18 19Console.WriteLine("CurrentUserName = {0}", piSystem.CurrentUserName); 20Console.WriteLine("AuthenticationType = {0}", piSystem.ConnectionInfo.AuthenticationType); 21Console.WriteLine(); 22 23piSystem.Disconnect(); 24 25// implicit connection using Claims Identity specified by PISystems constructor 26string ElementPath = $@"\\{piSystemName}\{myAFDatabase}\{myAFElement}"; 27element = AFElement.FindElementsByPath(new[] { ElementPath }, null)[ElementPath]; 28Console.WriteLine("CurrentUserName = {0}", piSystem.CurrentUserName); 29Console.WriteLine("AuthenticationType = {0}", piSystem.ConnectionInfo.AuthenticationType); 30Console.WriteLine();
Explicit Connection
1// Get the PISystems collection for the current user and default PISystem. 2PISystem myPISystem = new PISystems().DefaultPISystem; 3 4// Simple connect. 5myPISystem.Connect(); 6myPISystem.Disconnect(); 7 8// Connect and display a credential prompt dialog if current user login fails. 9// Only available in .Net Framework AFSDK 10// myPISystem.Connect(true, null); 11// myPISystem.Disconnect(); 12 13try 14{ 15 // Connect using a specified credential. 16 NetworkCredential credential = new NetworkCredential("guest", String.Empty); 17 myPISystem.Connect(credential); 18} 19catch (Exception ex) 20{ 21 // Expected exception since credential needs a valid user name and password. 22 Console.WriteLine(ex.Message); 23}
1' Get the PISystems collection for the current user and default PISystem. 2Dim myPISystem As PISystem = New PISystems().DefaultPISystem 3 4' Simple connect. 5myPISystem.Connect() 6myPISystem.Disconnect() 7 8' Connect and display a credential prompt dialog if current user login fails. 9' Only available in .Net Framework AFSDK 10' myPISystem.Connect(True, Nothing) 11' myPISystem.Disconnect() 12 13Try 14 ' Connect using a specified credential. 15 Dim credential As NetworkCredential = New NetworkCredential("guest", String.Empty) 16 myPISystem.Connect(credential) 17Catch ex As Exception 18 ' Expected exception since credential needs a valid user name and password. 19 Console.WriteLine(ex.Message) 20End Try
No code example is currently available or this language may not be supported.
No code example is currently available or this language may not be supported.
Explicit Connection Using OpenId
1PISystems myPISystems = new PISystems(); 2PISystem piSystem = myPISystems.DefaultPISystem; 3 4// explicit connection using access token 5piSystem.Connect(TestAccountAccessToken); 6Console.WriteLine("CurrentUserName = {0}", piSystem.CurrentUserName); 7Console.WriteLine("AuthenticationType = {0}", piSystem.ConnectionInfo.AuthenticationType); 8Console.WriteLine(); 9 10// explicit connection using ClientId and ClientSecret 11piSystem.Connect(TestClientId, TestClientSecret); 12Console.WriteLine("CurrentUserName = {0}", piSystem.CurrentUserName); 13Console.WriteLine("AuthenticationType = {0}", piSystem.ConnectionInfo.AuthenticationType); 14Console.WriteLine(); 15 16// for explicit connections using Authorization Code Flow refer to the ConnectWithPrompt documentation.
Collective Connection
1// Get the PISystems collection for the current user and default PISystem. 2PISystem myPISystem = new PISystems().DefaultPISystem; 3 4// Set default for all connections to be based upon collective member's priority. 5AFConnectionInfo.DefaultPreference = AFConnectionPreference.Any; 6AFCollectiveMember myMember; 7 8// Simple connect will use Default Preference. 9myPISystem.Connect(); 10myPISystem.Disconnect(); 11 12// Check if default PISystem is a Collective. 13if (myPISystem.Collective != null) 14{ 15 // Connect specifying that Primary is required and display a credential 16 // Connect and display a credential prompt dialog if current user login fails. 17 // Only available in .Net Framework AFSDK 18 // myPISystem.Connect(true, null, AFConnectionPreference.RequirePrimary); 19 // myPISystem.Disconnect(); 20 21 // Connect specifying that Primary is required and display a credential 22 // Connect and display a credential prompt dialog if current user login fails. 23 // Only available in .Net Framework AFSDK. 24 // Connect to a specific collective member and display a credential 25 // Prompt dialog if current user login fails. 26 // myMember = myPISystem.Collective.Members[0]; 27 // myMember.Connect(true, null); 28 // myPISystem.Disconnect(); 29 30 try 31 { 32 // Connect to a specific collective member using a specified credential. 33 myMember = myPISystem.Collective.Members[0]; 34 NetworkCredential credential = new NetworkCredential("guest", String.Empty); 35 myMember.Connect(credential); 36 } 37 catch (Exception ex) 38 { 39 // Expected exception since credential needs a valid user name and password. 40 Console.WriteLine(ex.Message); 41 } 42}
1' Get the PISystems collection for the current user and default PISystem. 2Dim myPISystem As PISystem = New PISystems().DefaultPISystem 3 4' Set default for all connections to be based upon collective member's priority. 5AFConnectionInfo.DefaultPreference = AFConnectionPreference.Any 6 7Dim myMember As AFCollectiveMember 8 9' Simple connect will use Default Preference. 10myPISystem.Connect() 11myPISystem.Disconnect() 12 13' Check if default PISystem is a Collective. 14If (myPISystem.Collective IsNot Nothing) Then 15 ' Connect specifying that Primary is required and display a credential 16 ' Prompt dialog if current user login fails. 17 ' Only available in .Net Framework AFSDK 18 ' myPISystem.Connect(True, Nothing, AFConnectionPreference.RequirePrimary) 19 ' myPISystem.Disconnect() 20 21 ' Connect to a specific collective member and display a credential 22 ' Prompt dialog if current user login fails. 23 ' Only available in .Net Framework AFSDK 24 ' myMember = myPISystem.Collective.Members(0) 25 ' myMember.Connect(True, Nothing) 26 ' myPISystem.Disconnect() 27 28 Try 29 ' Connect to a specific collective member using a specified credential. 30 myMember = myPISystem.Collective.Members(0) 31 Dim credential As NetworkCredential = New NetworkCredential("guest", String.Empty) 32 myMember.Connect(credential) 33 Catch ex As Exception 34 ' Expected exception since credential needs a valid user name and password. 35 Console.WriteLine(ex.Message) 36 End Try 37End If
No code example is currently available or this language may not be supported.
No code example is currently available or this language may not be supported.
Multi-User Connection
1// Get the PISystems collection for the current user and default PISystem. 2PISystem myPISystem = new PISystems().DefaultPISystem; 3 4// Do operation, a connection will automatically be created if needed for this user. 5AFValue myValue = null; 6AFAttribute myAttribute = AFAttribute.FindAttribute(@"MyDatabase\Element#1|Attribute#1", myPISystem); 7if (myAttribute != null) 8 myValue = myAttribute.GetValue();
1' Get the PISystems collection for the current user and default PISystem. 2Dim myPISystem As PISystem = New PISystems().DefaultPISystem 3 4' Do operation, a connection will automatically be created if needed for this user. 5Dim myValue As AFValue = Nothing 6Dim myAttribute As AFAttribute = AFAttribute.FindAttribute("MyDatabase\Element#1|Attribute#1", myPISystem) 7If (Not (myAttribute) Is Nothing) Then 8 myValue = myAttribute.GetValue 9End If
No code example is currently available or this language may not be supported.
No code example is currently available or this language may not be supported.