1 //---------------------------------------------------------------- 2 // Copyright (c) Microsoft Corporation. All rights reserved. 3 //---------------------------------------------------------------- 4 5 namespace System.ServiceModel.Routing 6 { 7 using System; 8 using System.ServiceModel; 9 using System.ServiceModel.Channels; 10 using System.ServiceModel.Description; 11 using System.Transactions; 12 using SR2 = System.ServiceModel.Routing.SR; 13 using System.Runtime; 14 15 static class RoutingUtilities 16 { 17 internal const string RoutingNamespace = "http://schemas.microsoft.com/netfx/2009/05/routing"; 18 Abort(ICommunicationObject commObj, object identifier)19 internal static void Abort(ICommunicationObject commObj, object identifier) 20 { 21 if (TD.RoutingServiceAbortingChannelIsEnabled()) 22 { 23 TD.RoutingServiceAbortingChannel(identifier != null ? identifier.ToString() : string.Empty); 24 } 25 26 //The Exception contract for ICommunicationObject.Abort is to never throw, anything else is a fatal error. 27 commObj.Abort(); 28 } 29 IsMessageUsingWSSecurity(UnderstoodHeaders understoodHeaders)30 internal static bool IsMessageUsingWSSecurity(UnderstoodHeaders understoodHeaders) 31 { 32 foreach (MessageHeaderInfo headerInfo in understoodHeaders) 33 { 34 if (string.Equals(headerInfo.Namespace, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", StringComparison.Ordinal) || //wsu 35 string.Equals(headerInfo.Namespace, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", StringComparison.Ordinal) || //wsse 36 string.Equals(headerInfo.Namespace, "http://docs.oasis-open.org/wss/oasis-wss-wsecurity-secext-1.1.xsd", StringComparison.Ordinal)) //wsse11 37 { 38 return true; 39 } 40 } 41 return false; 42 } 43 GetAddressingNamespace(AddressingVersion addressing)44 internal static string GetAddressingNamespace(AddressingVersion addressing) 45 { 46 string ns; 47 if (addressing == AddressingVersion.WSAddressingAugust2004) 48 { 49 ns = "http://schemas.xmlsoap.org/ws/2004/08/addressing"; 50 } 51 else if (addressing == AddressingVersion.WSAddressing10) 52 { 53 ns = "http://www.w3.org/2005/08/addressing"; 54 } 55 else if (addressing == AddressingVersion.None) 56 { 57 ns = "http://schemas.microsoft.com/ws/2005/05/addressing/none"; 58 } 59 else 60 { 61 throw FxTrace.Exception.Argument("addressing", SR2.AddressingVersionInvalid(addressing.ToString())); 62 } 63 return ns; 64 } 65 IsRoutingServiceNamespace(string contractNamespace)66 internal static bool IsRoutingServiceNamespace(string contractNamespace) 67 { 68 return string.Equals(contractNamespace, RoutingUtilities.RoutingNamespace, StringComparison.Ordinal); 69 } 70 IsTransactedReceive(Binding binding, BindingParameterCollection bindingParameters)71 internal static bool IsTransactedReceive(Binding binding, BindingParameterCollection bindingParameters) 72 { 73 // New school 74 ITransactedBindingElement transactedBindingElement = binding.GetProperty<ITransactedBindingElement>(bindingParameters); 75 if (transactedBindingElement != null) 76 { 77 return transactedBindingElement.TransactedReceiveEnabled; 78 } 79 80 // Old School 81 foreach (BindingElement element in binding.CreateBindingElements()) 82 { 83 transactedBindingElement = element as ITransactedBindingElement; 84 if (transactedBindingElement != null && transactedBindingElement.TransactedReceiveEnabled) 85 { 86 return true; 87 } 88 } 89 return false; 90 } 91 SafeRollbackTransaction(CommittableTransaction transaction)92 internal static void SafeRollbackTransaction(CommittableTransaction transaction) 93 { 94 if (transaction != null) 95 { 96 try 97 { 98 transaction.Rollback(); 99 transaction.Dispose(); 100 } 101 catch (TransactionException transactionException) 102 { 103 if (TD.RoutingServiceHandledExceptionIsEnabled()) 104 { 105 TD.RoutingServiceHandledException(null, transactionException); 106 } 107 } 108 catch (ObjectDisposedException disposedException) 109 { 110 if (TD.RoutingServiceHandledExceptionIsEnabled()) 111 { 112 TD.RoutingServiceHandledException(null, disposedException); 113 } 114 } 115 } 116 } 117 } 118 } 119