Esempio n. 1
0
        /// <summary>
        /// Handle request and getting information from it, then put it to <see cref="System.Runtime.Remoting.Messaging.CallContext"/>
        /// </summary>
        /// <param name="requestContext"></param>
        /// <param name="requestMessage"></param>
        /// <returns></returns>
        /// <seealso cref="ServiceRemotingRequestMessageExtensions"/>
        public override Task <IServiceRemotingResponseMessage> HandleRequestResponseAsync(IServiceRemotingRequestContext requestContext, IServiceRemotingRequestMessage requestMessage)
        {
            /// put info to <see cref="System.Runtime.Remoting.Messaging.CallContext"/> using helper methods from <see cref="ServiceRemotingRequestMessageExtensions"/>
            // we can use CallContext directly, because in any case this method can't be unit-tested
            var correlationId = requestMessage.GetColerationId();
            var requestData   = requestMessage.GetRequestData();

            // execute base handler in context of the service to send data to CallContext
            return(ServiceRequestContext.RunInRequestContext(async() =>
                                                             await base.HandleRequestResponseAsync(
                                                                 requestContext,
                                                                 requestMessage),
                                                             correlationId, requestData));
        }
Esempio n. 2
0
        /// <summary>
        /// This is wrap method to call any async methods in the context
        /// You can use it inside any method which use remoting or in middleware to wrap all methods
        /// </summary>
        /// <param name="action"></param>
        /// <param name="correlationId"></param>
        /// <param name="requestData"></param>
        /// <returns></returns>
        public static Task RunInRequestContext(Func <Task> action, Guid correlationId, RequestData requestData)
        {
            Task <Task> task = null;

            task = new Task <Task>(async() =>
            {
                ServiceRequestContext.Current = new ServiceRequestContext(correlationId, requestData);
                try
                {
                    await action();
                }
                finally
                {
                    ServiceRequestContext.Current = null;
                }
            });
            task.Start();
            return(task.Unwrap());
        }