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