public static void CreateIfRequired(ImmutableDispatchRuntime dispatchRuntime, ref MessageRpc messageRpc) { if (messageRpc.Operation.ReceiveContextAcknowledgementMode != ReceiveContextAcknowledgementMode.ManualAcknowledgement) { ReceiveContext property = null; if (!ReceiveContext.TryGet(messageRpc.Request, out property)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("SFxReceiveContextPropertyMissing", new object[] { typeof(ReceiveContext).Name }))); } messageRpc.Request.Properties.Remove(ReceiveContext.Name); if ((messageRpc.Operation.ReceiveContextAcknowledgementMode == ReceiveContextAcknowledgementMode.AutoAcknowledgeOnReceive) && !messageRpc.Operation.TransactionRequired) { AcknowledgementCompleteCallbackState state = new AcknowledgementCompleteCallbackState { DispatchRuntime = dispatchRuntime, Rpc = messageRpc }; IAsyncResult result = new AcknowledgementCompleteAsyncResult(property, TimeSpan.MaxValue, ref messageRpc, null, handleEndComplete, state); if (result.CompletedSynchronously) { AcknowledgementCompleteAsyncResult.End(result); } } else { messageRpc.ReceiveContext = new ReceiveContextRPCFacet(property); } } }
public void Complete(ImmutableDispatchRuntime dispatchRuntime, ref MessageRpc rpc, TimeSpan timeout, Transaction transaction) { AcknowledgementCompleteCallbackState state = new AcknowledgementCompleteCallbackState { DispatchRuntime = dispatchRuntime, Rpc = rpc }; IAsyncResult result = new AcknowledgementCompleteAsyncResult(this.receiveContext, timeout, ref rpc, transaction, handleEndComplete, state); if (result.CompletedSynchronously) { AcknowledgementCompleteAsyncResult.End(result); } }
private static void HandleEndComplete(IAsyncResult result) { if (!result.CompletedSynchronously) { try { AcknowledgementCompleteAsyncResult.End(result); } catch (Exception exception) { if (Fx.IsFatal(exception)) { throw; } AcknowledgementCompleteCallbackState asyncState = (AcknowledgementCompleteCallbackState)result.AsyncState; MessageRpc rpc = asyncState.Rpc; rpc.Error = exception; asyncState.DispatchRuntime.ErrorBehavior.HandleError(ref rpc); } } }