internal static void VerifyReceiver(MsmqReceiveParameters receiveParameters, Uri listenUri) { MsmqException exception; bool flag2; if (!receiveParameters.Durable && receiveParameters.ExactlyOnce) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("MsmqNoAssurancesForVolatile"))); } if (receiveParameters.ReceiveContextSettings.Enabled && !receiveParameters.ExactlyOnce) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("MsmqExactlyOnceNeededForReceiveContext"))); } VerifySecurity(receiveParameters.TransportSecurity, null); string formatName = receiveParameters.AddressTranslator.UriToFormatName(listenUri); if (receiveParameters.ReceiveContextSettings.Enabled && formatName.Contains(";")) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("MsmqReceiveContextSubqueuesNotSupported"))); } if (!MsmqQueue.IsReadable(formatName, out exception)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("MsmqQueueNotReadable"), exception)); } bool flag = false; flag = MsmqQueue.TryGetIsTransactional(formatName, out flag2); try { if (!flag && (receiveParameters is MsmqTransportReceiveParameters)) { flag = MsmqQueue.TryGetIsTransactional(MsmqUri.ActiveDirectoryAddressTranslator.UriToFormatName(listenUri), out flag2); } } catch (MsmqException exception2) { MsmqDiagnostics.ExpectedException(exception2); } if (flag) { if (!receiveParameters.ExactlyOnce && flag2) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("MsmqNonTransactionalQueueNeeded"))); } if (receiveParameters.ExactlyOnce && !flag2) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("MsmqTransactionalQueueNeeded"))); } } if (receiveParameters.ExactlyOnce) { if (Msmq.IsAdvancedPoisonHandlingSupported) { if (!formatName.Contains(";")) { if (!MsmqQueue.IsMoveable(formatName + ";retry")) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("MsmqDirectFormatNameRequiredForPoison"))); } } else if (ReceiveErrorHandling.Move == receiveParameters.ReceiveErrorHandling) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("MsmqNoMoveForSubqueues"))); } } else if ((ReceiveErrorHandling.Reject == receiveParameters.ReceiveErrorHandling) || (ReceiveErrorHandling.Move == receiveParameters.ReceiveErrorHandling)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("MsmqAdvancedPoisonHandlingRequired"))); } } }
internal static void VerifyReceiver(MsmqReceiveParameters receiveParameters, Uri listenUri) { if (!receiveParameters.Durable && receiveParameters.ExactlyOnce) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.MsmqNoAssurancesForVolatile))); } if (receiveParameters.ReceiveContextSettings.Enabled && !receiveParameters.ExactlyOnce) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.MsmqExactlyOnceNeededForReceiveContext))); } VerifySecurity(receiveParameters.TransportSecurity, null); string formatName = receiveParameters.AddressTranslator.UriToFormatName(listenUri); if (receiveParameters.ReceiveContextSettings.Enabled && formatName.Contains(";")) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.MsmqReceiveContextSubqueuesNotSupported))); } // check if can open the queue for read MsmqException msmqException; if (!MsmqQueue.IsReadable(formatName, out msmqException)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.MsmqQueueNotReadable), msmqException)); } // check if the queue is transactional bool knownTxStatus = false; bool isQueueTx; knownTxStatus = MsmqQueue.TryGetIsTransactional(formatName, out isQueueTx); try { if (!knownTxStatus && (receiveParameters is MsmqTransportReceiveParameters)) { knownTxStatus = MsmqQueue.TryGetIsTransactional(MsmqUri.ActiveDirectoryAddressTranslator.UriToFormatName(listenUri), out isQueueTx); } } catch (MsmqException ex) // active directory lookup may cause exceptions for certain scenarios { MsmqDiagnostics.ExpectedException(ex); } if (knownTxStatus) { if (!receiveParameters.ExactlyOnce && isQueueTx) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.MsmqNonTransactionalQueueNeeded))); } if (receiveParameters.ExactlyOnce && !isQueueTx) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.MsmqTransactionalQueueNeeded))); } } // check poison handling settings if (receiveParameters.ExactlyOnce) { if (Msmq.IsAdvancedPoisonHandlingSupported) // msmq 4 { if (formatName.Contains(";")) { // no retry queues for subqueues if (ReceiveErrorHandling.Move == receiveParameters.ReceiveErrorHandling) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.MsmqNoMoveForSubqueues))); } } else { // should be able to open the retry queue for move if (!MsmqQueue.IsMoveable(formatName + ";retry")) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.MsmqDirectFormatNameRequiredForPoison))); } } } else { if (ReceiveErrorHandling.Reject == receiveParameters.ReceiveErrorHandling || ReceiveErrorHandling.Move == receiveParameters.ReceiveErrorHandling) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.MsmqAdvancedPoisonHandlingRequired))); } } } }