e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
132 lines
6.1 KiB
C#
132 lines
6.1 KiB
C#
//------------------------------------------------------------
|
|
// 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));
|
|
}
|
|
}
|
|
}
|
|
}
|