public async Task <string> ProcessMessage(PostUrlParameters urlParameters, Stream requestStream) { var requestMessage = BuildRequest(urlParameters, requestStream); var key = requestMessage.GetDuplicationKey(); // 如果是正在处理中的重复消息, 则返回等待处理完成返回处理结果 var responseText = await GetResponseFromExecution(urlParameters, key).ConfigureAwait(false); if (responseText != null) { OnResponseGenerated(responseText, ResponseSource.Executing); return(responseText); } // 如果是已处理的重复消息, 则直接返回待处理结果 responseText = await GetResponseFromCache(key); if (responseText != null) { OnResponseGenerated(responseText, ResponseSource.Cache); return(responseText); } var handler = CreateHandler(); var task = handler.Handle(requestMessage); // 开始处理后, 保存正在处理的消息 var done = task.IsCompleted; if (!done) { _executionDictionary.Add(key, task); } var responseMessage = await task.ConfigureAwait(false); responseText = SerializeResponse(urlParameters, responseMessage); // 处理完成后, 从正在处理转移到处理完成 await _responseCache.Add(key, responseText).ConfigureAwait(false); if (!done) { _executionDictionary.Remove(key); } OnResponseGenerated(responseText, ResponseSource.New); return(responseText); }
public async Task <string> ProcessMessage(PostUrlParameters urlParameters, Stream requestStream) { var requestMessage = BuildRequest(urlParameters, requestStream); var key = requestMessage.GetDuplicationKey(); ResponseSource source; // 如果是正在处理中的重复消息, 则返回等待处理完成返回处理结果 var responseMessage = await GetResponseFromExecution(urlParameters, key).ConfigureAwait(false); if (responseMessage != null) { source = ResponseSource.Executing; } else { // 如果是已处理的重复消息, 则直接返回待处理结果 responseMessage = await GetResponseFromCache(key).ConfigureAwait(false); if (responseMessage != null) { source = ResponseSource.Cache; } else { var handler = CreateHandler(); bool done = false; try { var task = handler.Handle(requestMessage); // 开始处理后, 保存正在处理的消息 done = task.IsCompleted; if (!done) { _executionDictionary.Add(key, task); } responseMessage = await task.ConfigureAwait(false); } finally { if (handler is IDisposable d) { d.Dispose(); } } // 处理完成后, 从正在处理转移到处理完成 await _responseCache.Add(key, responseMessage).ConfigureAwait(false); if (!done) { _executionDictionary.Remove(key); } source = ResponseSource.New; } } var responseText = responseMessage.Serialize(); OnResponseGenerated(responseText, source); if (responseMessage.EncryptionRequired) { responseText = EncryptResponse(urlParameters, responseText); } return(responseText); }