150 lines
4.5 KiB
C#
150 lines
4.5 KiB
C#
|
//------------------------------------------------------------
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//------------------------------------------------------------
|
||
|
namespace System.ServiceModel.Description
|
||
|
{
|
||
|
using System;
|
||
|
using System.ServiceModel.Dispatcher;
|
||
|
using System.ServiceModel.Channels;
|
||
|
using System.ServiceModel.Administration;
|
||
|
|
||
|
[AttributeUsage(AttributeTargets.Method)]
|
||
|
[Obsolete("The WF3 types are deprecated. Instead, please use the new WF4 types from System.Activities.*")]
|
||
|
public sealed class DurableOperationAttribute : Attribute, IOperationBehavior, IWmiInstanceProvider
|
||
|
{
|
||
|
static DurableOperationAttribute defaultInstance = new DurableOperationAttribute();
|
||
|
bool canCreateInstance;
|
||
|
bool canCreateInstanceSetExplicitly;
|
||
|
bool completesInstance;
|
||
|
|
||
|
public DurableOperationAttribute()
|
||
|
{
|
||
|
this.completesInstance = false;
|
||
|
}
|
||
|
|
||
|
public bool CanCreateInstance
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.canCreateInstance;
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
this.canCreateInstance = value;
|
||
|
this.canCreateInstanceSetExplicitly = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public bool CompletesInstance
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.completesInstance;
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
this.completesInstance = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal static DurableOperationAttribute DefaultInstance
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return defaultInstance;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void AddBindingParameters(
|
||
|
OperationDescription operationDescription,
|
||
|
BindingParameterCollection bindingParameters)
|
||
|
{
|
||
|
// empty
|
||
|
}
|
||
|
|
||
|
public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
|
||
|
{
|
||
|
// empty
|
||
|
}
|
||
|
|
||
|
public void ApplyDispatchBehavior(
|
||
|
OperationDescription operationDescription,
|
||
|
DispatchOperation dispatchOperation)
|
||
|
{
|
||
|
if (dispatchOperation == null)
|
||
|
{
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("dispatchOperation");
|
||
|
}
|
||
|
|
||
|
if (dispatchOperation.Invoker == null)
|
||
|
{
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
|
||
|
new InvalidOperationException(
|
||
|
SR2.GetString(
|
||
|
SR2.ExistingIOperationInvokerRequired,
|
||
|
typeof(DurableOperationAttribute).Name)));
|
||
|
}
|
||
|
|
||
|
if (operationDescription == null)
|
||
|
{
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("operationDescription");
|
||
|
}
|
||
|
|
||
|
if (operationDescription.DeclaringContract == null)
|
||
|
{
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument(
|
||
|
"operationDescription",
|
||
|
SR2.GetString(SR2.OperationDescriptionNeedsDeclaringContract));
|
||
|
}
|
||
|
|
||
|
bool canCreate = CanCreateInstanceForOperation(dispatchOperation.IsOneWay);
|
||
|
|
||
|
dispatchOperation.Invoker =
|
||
|
new ServiceOperationInvoker(
|
||
|
dispatchOperation.Invoker,
|
||
|
this.CompletesInstance,
|
||
|
canCreate,
|
||
|
operationDescription.DeclaringContract.SessionMode != SessionMode.NotAllowed);
|
||
|
}
|
||
|
|
||
|
void IWmiInstanceProvider.FillInstance(IWmiInstance wmiInstance)
|
||
|
{
|
||
|
wmiInstance.SetProperty("CanCreateInstance", this.CanCreateInstance);
|
||
|
wmiInstance.SetProperty("CompletesInstance", this.CompletesInstance);
|
||
|
}
|
||
|
|
||
|
string IWmiInstanceProvider.GetInstanceType()
|
||
|
{
|
||
|
return "DurableOperationAttribute";
|
||
|
}
|
||
|
|
||
|
public void Validate(OperationDescription operationDescription)
|
||
|
{
|
||
|
// empty
|
||
|
}
|
||
|
|
||
|
internal bool CanCreateInstanceForOperation(bool isOneWay)
|
||
|
{
|
||
|
bool canCreate = false;
|
||
|
|
||
|
if (this.canCreateInstanceSetExplicitly)
|
||
|
{
|
||
|
canCreate = this.canCreateInstance;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (isOneWay)
|
||
|
{
|
||
|
canCreate = false;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
canCreate = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return canCreate;
|
||
|
}
|
||
|
}
|
||
|
}
|