106 lines
3.9 KiB
C#
106 lines
3.9 KiB
C#
//------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------
|
|
namespace System.ServiceModel.Dispatcher
|
|
{
|
|
using System.ServiceModel.Channels;
|
|
|
|
class DurableMessageDispatchInspector : IDispatchMessageInspector
|
|
{
|
|
public const string NewDurableInstanceIdPropertyName = "newDurableInstanceIdProperty";
|
|
const string suppressContextOnReply = "suppressContextOnReply";
|
|
SessionMode sessionMode;
|
|
|
|
public DurableMessageDispatchInspector(SessionMode sessionMode)
|
|
{
|
|
this.sessionMode = sessionMode;
|
|
}
|
|
|
|
public static void SuppressContextOnReply(OperationContext operationContext)
|
|
{
|
|
if (operationContext == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("operationContext");
|
|
}
|
|
operationContext.OutgoingMessageProperties[suppressContextOnReply] = true;
|
|
}
|
|
|
|
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
|
|
{
|
|
if (instanceContext == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("instanceContext");
|
|
}
|
|
|
|
if (request == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("request");
|
|
}
|
|
|
|
if (sessionMode != SessionMode.NotAllowed)
|
|
{
|
|
object result = null;
|
|
|
|
if (request.Properties.TryGetValue(NewDurableInstanceIdPropertyName, out result))
|
|
{
|
|
return result.ToString();
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public void BeforeSendReply(ref Message reply, object correlationState)
|
|
{
|
|
try
|
|
{
|
|
if (reply != null)
|
|
{
|
|
ContextMessageProperty context = null;
|
|
|
|
if (sessionMode == SessionMode.NotAllowed || reply.Properties.ContainsKey(suppressContextOnReply))
|
|
{
|
|
if (ContextMessageProperty.TryGet(reply, out context))
|
|
{
|
|
context.Context.Clear();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
string newInstanceId = correlationState as string;
|
|
|
|
if (newInstanceId != null)
|
|
{
|
|
|
|
if (!ContextMessageProperty.TryGet(reply, out context))
|
|
{
|
|
context = new ContextMessageProperty();
|
|
context.Context[WellKnownContextProperties.InstanceId] = newInstanceId;
|
|
context.AddOrReplaceInMessage(reply);
|
|
}
|
|
else
|
|
{
|
|
context.Context[WellKnownContextProperties.InstanceId] = newInstanceId;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
DurableInstance durableInstance = OperationContext.Current.InstanceContext.Extensions.Find<DurableInstance>();
|
|
|
|
if (durableInstance == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
|
|
new InvalidOperationException(
|
|
SR2.GetString(
|
|
SR2.RequiredInstanceContextExtensionNotFound,
|
|
typeof(DurableInstance).Name)));
|
|
}
|
|
//Decrement InstanceActivity Count
|
|
durableInstance.DecrementActivityCount();
|
|
}
|
|
}
|
|
}
|
|
}
|