/// <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)); }
/// <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()); }