public async Task TransferSubscriptions() { // get or add application certificate. var localCertificate = this.localDescription.GetCertificate(); if (localCertificate == null) { throw new ServiceResultException(StatusCodes.BadSecurityChecksFailed, "Application certificate is missing."); } // discover available endpoints of server. var getEndpointsRequest = new GetEndpointsRequest { EndpointUrl = this.endpointUrl, ProfileUris = new[] { TransportProfileUris.UaTcpTransport } }; Console.WriteLine($"Discovering endpoints of '{getEndpointsRequest.EndpointUrl}'."); var getEndpointsResponse = await UaTcpDiscoveryClient.GetEndpointsAsync(getEndpointsRequest); var selectedEndpoint = getEndpointsResponse.Endpoints.OrderBy(e => e.SecurityLevel).Last(); IUserIdentity selectedUserIdentity = new UserNameIdentity("root", "secret"); var client = new UaTcpSessionClient( this.localDescription, localCertificate, selectedUserIdentity, selectedEndpoint); Console.WriteLine($"Creating session with endpoint '{client.RemoteEndpoint.EndpointUrl}'."); Console.WriteLine($"SecurityPolicy: '{client.RemoteEndpoint.SecurityPolicyUri}'."); Console.WriteLine($"SecurityMode: '{client.RemoteEndpoint.SecurityMode}'."); await client.OpenAsync(); Console.WriteLine($"Activated session '{client.SessionId}'."); var req = new CreateSubscriptionRequest { RequestedPublishingInterval = 1000, RequestedMaxKeepAliveCount = 20, PublishingEnabled = true }; var res = await client.CreateSubscriptionAsync(req); Console.WriteLine($"Created subscription '{res.SubscriptionId}'."); Console.WriteLine($"Aborting session '{client.SessionId}'."); await client.AbortAsync(); var client2 = new UaTcpSessionClient( this.localDescription, localCertificate, selectedUserIdentity, selectedEndpoint); await client2.OpenAsync(); Console.WriteLine($"Activated session '{client2.SessionId}'."); var req2 = new TransferSubscriptionsRequest { SubscriptionIds = new[] { res.SubscriptionId } }; var res2 = await client2.TransferSubscriptionsAsync(req2); Console.WriteLine($"Transferred subscription result '{res2.Results[0].StatusCode}'."); Assert.IsTrue(StatusCode.IsGood(res2.Results[0].StatusCode)); Console.WriteLine($"Closing session '{client2.SessionId}'."); await client2.CloseAsync(); }
/// <summary> /// Transfers a Subscription and its MonitoredItems from one Session to another. /// </summary> /// <param name="client">A instance of <see cref="ISessionClient"/>.</param> /// <param name="request">A <see cref="TransferSubscriptionsRequest"/>.</param> /// <returns>A <see cref="Task"/> representing the asynchronous operation that returns a <see cref="TransferSubscriptionsResponse"/>.</returns> public static async Task<TransferSubscriptionsResponse> TransferSubscriptionsAsync(this ISessionClient client, TransferSubscriptionsRequest request) { if (request == null) { throw new ArgumentNullException("request"); } return (TransferSubscriptionsResponse)await client.RequestAsync(request).ConfigureAwait(false); }