//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------- namespace System.ServiceModel.Routing { using System; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Description; using System.Transactions; using SR2 = System.ServiceModel.Routing.SR; using System.Runtime; static class RoutingUtilities { internal const string RoutingNamespace = "http://schemas.microsoft.com/netfx/2009/05/routing"; internal static void Abort(ICommunicationObject commObj, object identifier) { if (TD.RoutingServiceAbortingChannelIsEnabled()) { TD.RoutingServiceAbortingChannel(identifier != null ? identifier.ToString() : string.Empty); } //The Exception contract for ICommunicationObject.Abort is to never throw, anything else is a fatal error. commObj.Abort(); } internal static bool IsMessageUsingWSSecurity(UnderstoodHeaders understoodHeaders) { foreach (MessageHeaderInfo headerInfo in understoodHeaders) { if (string.Equals(headerInfo.Namespace, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", StringComparison.Ordinal) || //wsu string.Equals(headerInfo.Namespace, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", StringComparison.Ordinal) || //wsse string.Equals(headerInfo.Namespace, "http://docs.oasis-open.org/wss/oasis-wss-wsecurity-secext-1.1.xsd", StringComparison.Ordinal)) //wsse11 { return true; } } return false; } internal static string GetAddressingNamespace(AddressingVersion addressing) { string ns; if (addressing == AddressingVersion.WSAddressingAugust2004) { ns = "http://schemas.xmlsoap.org/ws/2004/08/addressing"; } else if (addressing == AddressingVersion.WSAddressing10) { ns = "http://www.w3.org/2005/08/addressing"; } else if (addressing == AddressingVersion.None) { ns = "http://schemas.microsoft.com/ws/2005/05/addressing/none"; } else { throw FxTrace.Exception.Argument("addressing", SR2.AddressingVersionInvalid(addressing.ToString())); } return ns; } internal static bool IsRoutingServiceNamespace(string contractNamespace) { return string.Equals(contractNamespace, RoutingUtilities.RoutingNamespace, StringComparison.Ordinal); } internal static bool IsTransactedReceive(Binding binding, BindingParameterCollection bindingParameters) { // New school ITransactedBindingElement transactedBindingElement = binding.GetProperty(bindingParameters); if (transactedBindingElement != null) { return transactedBindingElement.TransactedReceiveEnabled; } // Old School foreach (BindingElement element in binding.CreateBindingElements()) { transactedBindingElement = element as ITransactedBindingElement; if (transactedBindingElement != null && transactedBindingElement.TransactedReceiveEnabled) { return true; } } return false; } internal static void SafeRollbackTransaction(CommittableTransaction transaction) { if (transaction != null) { try { transaction.Rollback(); transaction.Dispose(); } catch (TransactionException transactionException) { if (TD.RoutingServiceHandledExceptionIsEnabled()) { TD.RoutingServiceHandledException(null, transactionException); } } catch (ObjectDisposedException disposedException) { if (TD.RoutingServiceHandledExceptionIsEnabled()) { TD.RoutingServiceHandledException(null, disposedException); } } } } } }