コード例 #1
0
        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 <RespondResult> SendResponseAsync(this AppServiceRequest request, object message,
                                                                     IObjectSerializer serializer)
        {
            var valueSet       = serializer.SerializeToValueSet(message);
            var internalStatus = await request.SendResponseAsync(valueSet);

            var success = internalStatus == AppServiceResponseStatus.Success;

            return(new RespondResult(success ? ResponseStatus.Success : ResponseStatus.Failure, internalStatus));
        }
        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));
        }