0

첫 번째 활동에는 다른 활동과 함께 ReceiveSendReply 활동이 포함되어 있습니다. 이 액티비티에서는 워크 플로우 인스턴스를 생성합니다. 나는 OutArgument에 Intialized CorrelationHandle을 할당하려고합니다. 어떤 것이 외부 공유 varriable에 할당 될 것입니다.인수를 사용하여 두 개의 사용자 지정 활동간에 CorrelationHandle 공유

다른 활동에서 위의 활동으로 작성된 인스턴스를 다시 시작하는 또 다른 ReceiveSendReply 활동이 있습니다. 두 번째 활동에서 CorrelationHandle을 InArgument로 사용합니다. 나는이 InArgument에 외부의 공유 correlationHandle varriable을 할당 할 것이다.

이 워크 플로 서비스를 실행할 때 첫 번째 작업은 아무 문제없이 실행되고 상관 관계 키가 채워지고 응답에서 해당 상관 관계 키가 나타납니다. 받은 상관 관계 키를 사용하여 두 번째 작업을 실행하는 경우 다음 예외가있는 서비스가 반환됩니다.

"인스턴스 키 '45f99690-2829-3126-0782-99033212633c'이 연결되지 않아 InstancePersistenceCommand 실행이 중단되었습니다. 인스턴스 또는 키가 정리되었거나 키가 유효하지 않기 때문에 발생할 수 있습니다. 생성 된 메시지가 잘못된 시간에 보내 졌거나 잘못된 상관 관계 데이터가 포함 된 경우 키가 유효하지 않을 수 있습니다.

OutArgument 및 InArguments를 사용하여 두 개의 사용자 지정 작업간에 CorrelationHandle을 공유하는 방법을 알고 싶습니다.

public sealed class Create : Activity 
{ 
    public Create() 
    { 
     Implementation = new Func<Activity>(CreateBody); 
    } 

    public string ServiceContract { get; set; } 

    public string Operation { get; set; } 

    [RequiredArgument] 
    public OutArgument<CorrelationHandle> CorrelationHandle { get; set; } 

    Activity CreateBody() 
    { 
     // variables declaration. 
     var requestContent = new Variable<string>(); 
     var operationResponseParam = new Variable<OperationResponseParam>(); 
     var correlationKey = new Variable<string>(); 
     var correlationHandle = new Variable<CorrelationHandle>(); 

     Receive receiveRequest; 

     return new Sequence 
     { 
      Variables = { correlationHandle, correlationKey }, 
      Activities = 
      { 
       {receiveRequest = new Receive() 
       { 
        ServiceContractName = ServiceContract, 
        OperationName = Operation, 
        CanCreateInstance = true, 
        Content = new ReceiveMessageContent 
        { 
         Message = new OutArgument<string>(ctx => operationRequestParam.Get(ctx)) 
        }, 
       }}, 

       new Assign<string> 
       { 
        To = new OutArgument<string>(ctx => correlationKey.Get(ctx)), 
        Value = new InArgument<string>(ctx => Guid.NewGuid().ToString()) 
       }, 

       new Assign<ApplicationDataList> 
       { 
        To = new ArgumentReference<ApplicationDataList>("AppData"), 
        Value = new InArgument<ApplicationDataList>(ctx =>appData.Get(ctx)) 
       }, 

       new Assign<OperationResponseParam> 
       { 
        To = new OutArgument<OperationResponseParam>(ctx => operationResponseParam.Get(ctx)), 
        Value = new InArgument<OperationResponseParam> 
        { 
         Expression = new BuildResponse() 
         { 
          CorrelationKey = new InArgument<string>(correlationKey), 
         } 
        } 
       }, 

       new SendReply 
       { 
        Request = receiveRequest, 
        Content = new SendMessageContent 
        { 
         Message = new InArgument<OperationResponseParam>(ctx => operationResponseParam.Get(ctx)) 
        }, 

        CorrelationInitializers = 
        { 
         new QueryCorrelationInitializer 
         { 
          CorrelationHandle = new InArgument<CorrelationHandle>(correlationHandle), 
          MessageQuerySet = new MessageQuerySet 
          { 
           { 
            "CorrelationKey", new XPathMessageQuery("sm:header()/tempuri:CorrelationKey") 
           } 
          } 
         } 
        } 
       }, 

       new Assign<CorrelationHandle> 
       { 
        To = new ArgumentReference<CorrelationHandle>("CorrelationHandle"), 
        Value = new InArgument<CorrelationHandle>(ctx =>correlationHandle.Get(ctx)) 
       }, 
      } 
     }; 
    } 
} 


public sealed class Wait : Activity 
{ 
    public Wait() 
    { 
     Implementation = new Func<Activity>(CreateBody); 
    } 

    public string ServiceContract { get; set; } 

    public string Operation { get; set; } 

    [RequiredArgument] 
    public InArgument<CorrelationHandle> CorrelationHandle { get; set; } 

    Activity CreateBody() 
    { 
     // variables declaration. 

     var operationRequestParam = new Variable<OperationRequestParam>(); 
     var operationResponseParam = new Variable<OperationResponseParam>(); 
     var correlationHandle = new Variable<CorrelationHandle>(); 
     Receive receiveRequest; 

     return new Sequence 
     { 
      Variables = { correlationHandle }, 
      Activities = 
      { 
       new Sequence 
       { 
        Variables = {operationRequestParam, operationResponseParam }, 

        Activities = 
        { 
         {receiveRequest =new Receive() 
         { 
          ServiceContractName = ServiceContract, 
          OperationName = Operation, 
          CanCreateInstance = false, 
          CorrelatesWith = new InArgument<CorrelationHandle>(ctx => CorrelationHandle.Get(ctx)), 
          CorrelatesOn = new MessageQuerySet 
          { 
           { "CorrelationKey", new XPathMessageQuery("sm:header()/tempuri:CorrelationKey")} 
          }, 

          //parameters for receive 
          Content = new ReceiveMessageContent 
          { 
           Message = new OutArgument<OperationRequestParam>(ctx => operationRequestParam.Get(ctx)) 
          }, 
         }}, 


         new Assign<OperationResponseParam> 
         { 
          To = new OutArgument<OperationResponseParam>(operationResponseParam), 
          Value = new InArgument<OperationResponseParam> 
          { 
           Expression = new BuildResponse() 
           { 
            ApplicationData = new InArgument<ApplicationDataList>(ctx => appData.Get(ctx)), 
           } 
          } 
         }, 

         new SendReply 
         { 
          Request = receiveRequest, 
          Content = new SendMessageContent 
          { 
           Message = new InArgument<OperationResponseParam>(ctx => operationResponseParam.Get(ctx)) 
          } 
         }, 
        } 
       }, 
      } 
     }; 
    } 
} 
+0

커스텀 ReceiveSendReply 활동을 구현해야합니까? 왜 당신은 WF와 함께 제공되는 것들을 사용하고, 필요한 로직을 실행하기위한 좀 더 간단한 액티비티를 만들고, ReceiveSendReply 빌트인 액티비티의 일반적인 상관 옵션과 상호 연관시켜 보시지 않겠습니까? –

답변

1

핸들을 InArgument로 사용해야하며 핸들을 참조하는 객체는 InitializeCorrelation에 의해 수정됩니다. 따라서 두 가지 활동 모두에서 OutArgument 대신 InArgument를 사용하고 두 번째에서는 InArgument를 사용해야합니다.

public sealed class Create : Activity 
{ 
    public Create() 
    { 
     Implementation = new Func<Activity>(CreateBody); 
    } 

    public string ServiceContract { get; set; } 

    public string Operation { get; set; } 

    [RequiredArgument] 
    public InArgument<CorrelationHandle> CorrelationHandle { get; set; } 

    Activity CreateBody() 
    { 
     // variables declaration. 
     var operationRequestParam = new Variable<OperationRequestParam>(); 
     var appData = new Variable<ApplicationDataList>(); 
     var operationResponseParam = new Variable<OperationResponseParam>(); 
     var correlationKey = new Variable<string>(); 


     Receive receiveRequest; 

     return new Sequence 
     { 
      Variables = { correlationKey }, 
      Activities = 
      { 
       {receiveRequest = new Receive() 
       { 
        ServiceContractName = ServiceContract, 
        OperationName = Operation, 
        CanCreateInstance = true, 
        //parameters for receive 
        Content = new ReceiveMessageContent 
        { 
         Message = new OutArgument<string>(ctx => operationRequestParam.Get(ctx)) 
        }, 
       }}, 

       // Assign a unique identifier to the correlation key. 
       new Assign<string> 
       { 
        To = new OutArgument<string>(ctx => correlationKey.Get(ctx)), 
        Value = new InArgument<string>(ctx => Guid.NewGuid().ToString()) 
       }, 

       new Assign<OperationResponseParam> 
       { 
        To = new OutArgument<OperationResponseParam>(ctx => operationResponseParam.Get(ctx)), 
        Value = new InArgument<OperationResponseParam> 
        { 
         Expression = new BuildResponse() 
         { 
          CorrelationKey = new InArgument<string>(correlationKey), 
         } 
        } 
       }, 

       new SendReply 
       { 
        Request = receiveRequest, 
        Content = new SendMessageContent 
        { 
         Message = new InArgument<string>(ctx => operationResponseParam.Get(ctx)) 
        }, 

        CorrelationInitializers = 
        { 
         new QueryCorrelationInitializer 
         { 
          CorrelationHandle = new InArgument<CorrelationHandle>(ctx => CorrelationHandle.Get(ctx)), 
          MessageQuerySet = new MessageQuerySet 
          { 
           { 
            "CorrelationKey", new XPathMessageQuery("sm:header()/tempuri:CorrelationKey") 
           } 
          } 
         } 
        } 
       }, 
      } 
     }; 
    } 
} 

public sealed class Wait : Activity 
{ 
    static Wait() 
    { 
     AttributeTableBuilder builder = new AttributeTableBuilder(); 
     builder.AddCustomAttributes(typeof(Wait), "EscalationData", new EditorAttribute(typeof(EscalationDataEditor), typeof(DialogPropertyValueEditor))); 
     MetadataStore.AddAttributeTable(builder.CreateTable()); 
    } 

    public Wait() 
    { 
     Implementation = new Func<Activity>(CreateBody); 
    } 

    public EscalationInfoList EscalationData { get; set; } 

    public string ServiceContract { get; set; } 

    public string Operation { get; set; } 

    [RequiredArgument] 
    public InArgument<CorrelationHandle> CorrelationHandle { get; set; } 

    Activity CreateBody() 
    { 
     // variables declaration. 
     var appData = new Variable<ApplicationDataList>(); 
     var operationRequestParam = new Variable<OperationRequestParam>(); 
     var operationResponseParam = new Variable<OperationResponseParam>(); 

     Receive receiveRequest; 

     return new Sequence 
     { 
      Activities = 
      { 
       new Sequence 
       { 
        Variables = {operationRequestParam, operationResponseParam }, 

        Activities = 
        { 
         {receiveRequest =new Receive() 
         { 
          ServiceContractName = ServiceContract, 
          OperationName = Operation, 
          CanCreateInstance = false, 
          CorrelatesWith = new InArgument<CorrelationHandle>(ctx => CorrelationHandle.Get(ctx)), 
          CorrelatesOn = new MessageQuerySet 
          { 
           { "CorrelationKey", new XPathMessageQuery("sm:header()/tempuri:CorrelationKey")} 
          }, 

          //parameters for receive 
          Content = new ReceiveMessageContent 
          { 
           Message = new OutArgument<OperationRequestParam>(ctx => operationRequestParam.Get(ctx)) 
          }, 
         }}, 

         new SendReply 
         { 
          Request = receiveRequest, 
          Content = new SendMessageContent 
          { 
           Message = new InArgument<OperationResponseParam>(ctx => operationResponseParam.Get(ctx)) 
          } 
         }, 
        } 
       }, 
      } 
     } 
    } 
}