| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- //------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //------------------------------------------------------------
- namespace System.ServiceModel.Transactions
- {
- using System;
- using System.Diagnostics.CodeAnalysis;
- using System.Runtime;
- using System.ServiceModel.Channels;
- using System.Diagnostics;
- using System.ServiceModel;
- using System.Transactions;
- using System.Xml;
- using Microsoft.Transactions.Wsat.Messaging;
- using Microsoft.Transactions.Wsat.Protocol;
- using System.Security.Permissions;
- class WsatTransactionHeader : MessageHeader
- {
- string wsatHeaderElement;
- string wsatNamespace;
- CoordinationContext context;
- // The demand is not added now (in 4.5), to avoid a breaking change. To be considered in the next version.
- /*
- // We demand full trust because we call into CoordinationStrings.Version(..), which is defined in a non-APTCA assembly and does an Environment.FailFast
- // if the argument is invalid. It's recommended to not let partially trusted callers to bring down the process.
- // WSATs are not supported in partial trust, so customers should not be broken by this demand.
- [PermissionSet(SecurityAction.Demand, Unrestricted = true)]
- */
- public WsatTransactionHeader(CoordinationContext context, ProtocolVersion protocolVersion)
- {
- this.context = context;
- CoordinationStrings coordinationStrings = CoordinationStrings.Version(protocolVersion);
- this.wsatHeaderElement = coordinationStrings.CoordinationContext;
- this.wsatNamespace = coordinationStrings.Namespace;
- }
- public override bool MustUnderstand
- {
- get { return true; }
- }
-
- public override string Name
- {
- get { return wsatHeaderElement; }
- }
- public override string Namespace
- {
- get { return wsatNamespace; }
- }
- // The demand is not added now (in 4.5), to avoid a breaking change. To be considered in the next version.
- /*
- // We demand full trust because we call into CoordinationContext and CoordinationStrings, which are defined in a non-APTCA assembly. Also, CoordinationStrings.Version(..)
- // does an Environment.FailFast if the argument is invalid. It's recommended to not let partially trusted callers to bring down the process.
- // WSATs are not supported in partial trust, so customers should not be broken by this demand.
- [PermissionSet(SecurityAction.Demand, Unrestricted = true)]
- */
- public static CoordinationContext GetCoordinationContext(Message message, ProtocolVersion protocolVersion)
- {
- CoordinationStrings coordinationStrings = CoordinationStrings.Version(protocolVersion);
- string locWsatHeaderElement = coordinationStrings.CoordinationContext;
- string locWsatNamespace = coordinationStrings.Namespace;
-
- int index;
- try
- {
- index = message.Headers.FindHeader(locWsatHeaderElement, locWsatNamespace);
- }
- catch (MessageHeaderException e)
- {
- DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning);
- return null;
- }
- if (index < 0)
- return null;
- CoordinationContext context;
- XmlDictionaryReader reader = message.Headers.GetReaderAtHeader(index);
- using (reader)
- {
- context = GetCoordinationContext(reader, protocolVersion);
- }
- MessageHeaderInfo header = message.Headers[index];
- if (!message.Headers.UnderstoodHeaders.Contains(header))
- {
- message.Headers.UnderstoodHeaders.Add(header);
- }
- return context;
- }
- // The demand is not added now (in 4.5), to avoid a breaking change. To be considered in the next version.
- /*
- [PermissionSet(SecurityAction.Demand, Unrestricted = true)] // because we call into CoordinationContext, which is defined in a non-APTCA assembly; WSATs are not supported in partial trust, so customers should not be broken by this demand
- */
- protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
- {
- this.context.WriteContent(writer);
- }
- // The demand is not added now (in 4.5), to avoid a breaking change. To be considered in the next version.
- /*
- // We demand full trust because we call into CoordinationXmlDictionaryStrings.Version(..), which is defined in a non-APTCA assembly and does an Environment.FailFast
- // if the argument is invalid. It's recommended to not let partially trusted callers to bring down the process.
- // WSATs are not supported in partial trust, so customers should not be broken by this demand.
- [PermissionSet(SecurityAction.Demand, Unrestricted = true)]
- */
- public static CoordinationContext GetCoordinationContext(XmlDictionaryReader reader, ProtocolVersion protocolVersion)
- {
- CoordinationXmlDictionaryStrings coordinationXmlDictionaryStrings =
- CoordinationXmlDictionaryStrings.Version(protocolVersion);
- try
- {
- return CoordinationContext.ReadFrom(reader,
- coordinationXmlDictionaryStrings.CoordinationContext,
- coordinationXmlDictionaryStrings.Namespace,
- protocolVersion);
- }
- catch (InvalidCoordinationContextException e)
- {
- DiagnosticUtility.TraceHandledException(e, TraceEventType.Error);
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new TransactionException(SR.GetString(SR.WsatHeaderCorrupt), e));
- }
- }
- }
- }
|