public static async Task <ASConnection> AcceptConnectionAsync(AppServiceTriggerDetails e, BackgroundTaskDeferral connectionDeferral, IObjectSerializer serializer) { // Receive connection request, send connection response AppServiceRequest request = null; AppServiceDeferral deferral = null; var gotRequest = new SemaphoreSlim(0); e.AppServiceConnection.RequestReceived += OnRequestReceived; await gotRequest.WaitAsync(); e.AppServiceConnection.RequestReceived -= OnRequestReceived; var message = serializer.DeserializeFromValueSet(request.Message); if (message is ConnectionRequestMessage connectionRequest) { // Accept connection request var connectionId = "AS_" + Guid.NewGuid(); var connectionResponse = new ConnectionResponseMessage(connectionId); await request.SendResponseAsync(serializer.SerializeToValueSet(connectionResponse)); deferral.Complete(); return(new ASConnection( connectionId, e.AppServiceConnection, connectionDeferral, e.IsRemoteSystemConnection, serializer)); } else { // Wrong message received => reject connection var connectionResponse = new ConnectionResponseMessage(null); await request.SendResponseAsync(serializer.SerializeToValueSet(connectionResponse)); deferral.Complete(); connectionDeferral.Complete(); e.AppServiceConnection.Dispose(); return(null); } void OnRequestReceived(AppServiceConnection _, AppServiceRequestReceivedEventArgs r) { request = r.Request; deferral = r.GetDeferral(); gotRequest.Release(); } }
internal static async Task <RequestResult> SendMessageAsync(this AppServiceConnection connection, object message, RequestOptions options, IObjectSerializer serializer) { var valueSet = serializer.SerializeToValueSet(message); var internalResponse = await connection.SendMessageAsync(valueSet); var success = internalResponse.Status == AppServiceResponseStatus.Success; var responseMessage = (success && options.IsResponseRequired) ? serializer.DeserializeFromValueSet(internalResponse.Message) : null; return(new RequestResult( responseMessage, success ? RequestStatus.Success : RequestStatus.Failure, internalResponse.Status)); }